2015-12-19 3 views
0

Я пытаюсь сделать свое первое уведомление, и я получаю исключение. На основе метода onCreate() я звоню createNotification из SchedulerActivity класса и в этой процедуре я вызываю свой класс BroadcastReceiver. Но я получаю исключение в SchedulerActivity, когда я звоню BroadcastReceiver классу на Intent myIntent = new Intent(SchedulerActivity.this, MyReceiver.class);, и я не могу понять, почему.Android: Уведомление об уведомлении

Исключение:

java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {com.converter.android.daily/com.converter.android.daily.MainActivity}: java.lang.NullPointerException : Попытка вызвать виртуальный метод 'java.lang.String android.content.Context.getPackageName()' на нуль ссылки на объект
на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2416) в android.app.ActivityThread.handl eLaunchActivity (ActivityThread.java:2476) на android.app.ActivityThread.-wrap11 (ActivityThread.java)
в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1344)
в android.os. Handler.dispatchMessage (Handler.java:102)
на android.os.Looper.loop (Looper.java:148)
на android.app.ActivityThread.main (ActivityThread.java:5417)
в java.lang .reflect.Method.invoke (Native Method)
в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) в com.android.internal.os.ZygoteInit.ma в (ZygoteInit.java:616)
Вызванные: java.lang.NullPointerException: попытка вызвать виртуальный метод «java.lang.String android.content.Context.getPackageName()» на эталонного объекта нуля
на android.content.ContextWrapper.getPackageName (ContextWrapper.java:133) на android.content.ComponentName. (ComponentName.java:128)
на android.content.Intent. (Intent.java:4449)
в com.converter.android.daily.SchedulerActivity.createNotification (SchedulerActivity.java:272) at com.converter.android.daily.MainActivity.onCreate (MainActivity.java:3) 9) на android.app.Activity.performCreate (Activity.java:6251)
на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1107) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java : 2369) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2476) на android.app.ActivityThread.-wrap11 (ActivityThread.java)
в android.app.ActivityThread $ H.handleMessage (ActivityThread .java: 1344) на android.os.Handler.dispatchMessage (Handler.java:102)
на android.os.Looper.loop (Looper.java:1 48)
на android.app.ActivityThread.main (ActivityThread.java:5417)
в java.lang.reflect.Method.invoke (нативный метод)
на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)

Main.class

public class MainActivity extends BaseActivity { 
    private SchedulerActivity sch= new SchedulerActivity(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sch.createNotification(this.getApplicationContext()); 
} 

SchedulerActivity. класс

public class SchedulerActivity extends Activity implements PickerFragment.OnCompleteListener { 
(...) 
public void createNotification(Context context){ 

     long when = System.currentTimeMillis(); 
     String []parts; 
     String part1, part2; 

     SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); 
     status = pref.getString(botaoDaily, ""); 
     time = pref.getString(dHora,""); 

     if (status.compareToIgnoreCase("On")==0) { 

      NotificationManager notificationManager = (NotificationManager) context 
        .getSystemService(Context.NOTIFICATION_SERVICE); 

      NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
        context).setSmallIcon(R.drawable.ic_launcher) 
        .setContentTitle("Daily") 
        .setContentText("My first Notification") 
        .setAutoCancel(true).setWhen(when) 
        .setContentIntent(pendingIntent); 
      // .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000}); 
      notificationManager.notify(1, mNotifyBuilder.build()); 

      if(time.compareToIgnoreCase("")!=0) { 

       parts = time.split(":"); 
       part1 = parts[0]; 
       part2 = parts[1]; 

       /*hours = Integer.valueOf(part1); 
       minutes = Integer.valueOf(part2); 
       seconds = 0;*/ 

       Calendar calendar = Calendar.getInstance(); 

       calendar.set(Calendar.HOUR_OF_DAY, 16);/*TODO: hours, minutes*/ 
       calendar.set(Calendar.MINUTE, 45); 
       calendar.set(Calendar.SECOND, 15); 

       //Service -> MyAlarmService 
       Intent myIntent = new Intent(SchedulerActivity.this, MyReceiver.class); 
       pendingIntent = PendingIntent.getBroadcast(SchedulerActivity.this, 0, myIntent, 0); 
       AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
       alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); 

       PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0); 
       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000 /* milliseconds */ * 20 /* seconds */, alarmIntent); 

      } 
     } 
    } 

MyReceiver.class

public class MyReceiver extends BroadcastReceiver 
{ 
    public void onReceive(Context context, Intent intent) 
    { 
     Intent service1 = new Intent(context, MyAlarmService.class); 
     context.startService(service1); 
    } 
} 

Не могли бы вы помочь мне?

ответ

0

Вы не можете SchedulerActivity.this там. Вы не представляете эту активность, вместо этого вы просто создаете экземпляр класса SchedulerActivity и вызываете метод.

Изменение:

Intent myIntent = new Intent(SchedulerActivity.this, MyReceiver.class); 
pendingIntent = PendingIntent.getBroadcast(SchedulerActivity.this, 0, myIntent, 0); 

с

Intent myIntent = new Intent(context, MyReceiver.class); 
pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0); 
+0

Только один вопрос, я должен поставить код "createNotification" из SchedulerActivity в моем главном классе? Это потому, что тогда у меня есть «Системные службы, недоступные для Activity before onCreate()» исключение? – porthfind

+0

@porthfind: Вы можете поместить это в основную деятельность. Вызовите этот метод в onCreate (добавьте в качестве последнего оператора onCreate) –

0

private SchedulerActivity sch= new SchedulerActivity();

Вы не можете создать экземпляр деятельности, они могут быть созданы только косвенно с помощью намерения создания. Попробуйте реорганизовать это действие на простой класс и передать context родительской активности.

Смежные вопросы