2016-02-20 62 views
1

我是android开发的新手。我正在开发一个简单的应用程序,其中包含1个活动,1个BroadcastReceiver和1个Notification服务。有些报警设置为活动,我想在设备启动/重新启动时重新设置它们。无法在广播接收器中获取服务集中的意图数据

这里是MainActivity我的代码:

  //randomDates is an (Long) array of time in milliseconds 
      int len = randomDates.length; 

      AlarmManager[] alarmManager = new AlarmManager[len]; 
      ArrayList<PendingIntent> intentArray = new ArrayList(); 
      String type = "A"; 
      Long t = new Date().getTime(); 
      for (int i = 0; i < len; i++) { 
       if(t <= randomDates[i]) { 
        Intent myIntent = new Intent(MainActivity.this, Receiver.class); 
        if (i%2 == 1) { 
         type = "A"; 
        } else { 
         type = "P"; 
        } 
        myIntent.putExtra("type", type); 
        myIntent.putExtra("time", randomDates[i]); 
        PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, i, myIntent, PendingIntent.FLAG_ONE_SHOT); 
        alarmManager[i] = (AlarmManager) getSystemService(ALARM_SERVICE); 
        alarmManager[i].set(AlarmManager.RTC, randomDates[i], pendingIntent); 
        intentArray.add(pendingIntent); 
       } 
      } 

      sharedPref = getSharedPreferences("MyCalApp",Context.MODE_PRIVATE); 
      SharedPreferences.Editor editor = sharedPref.edit(); 
      editor.putBoolean("areAlarmsAlreadySet", false); 
      editor.putString("alarmDates",Arrays.toString(randomDates)); 
      editor.commit(); 

报警将在活动设置。 Receiver在Manifest文件中注册以接收事件。在接收器 的onReceive功能如下:

public void onReceive(Context context, Intent intent) { 
     if(intent.getAction() != null && intent.getAction().equalsIgnoreCase("android.intent.action.BOOT_COMPLETED")) { 
       Long[] randomDates1 = //get from shared Pref; 

       int len = randomDates1.length; 
       AlarmManager[] alarmManager = new AlarmManager[len]; 
       ArrayList<PendingIntent> intentArray = new ArrayList(); 
       String type = "A"; 
       Long t = new Date().getTime(); 
       for (int i = 0; i < len; i++) { 
        if (t <= randomDates1[i]) { 
         Intent myIntent = new Intent(context.getApplicationContext(), NotificationService.class); 
         if (i % 2 == 1) { 
          type = "A"; 
         } else { 
          type = "P"; 
         } 
         myIntent.putExtra("type", type); 
         myIntent.putExtra("time", randomDates1[i]); 
         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, myIntent, PendingIntent.FLAG_ONE_SHOT); 
         alarmManager[i] = (AlarmManager) context.getSystemService(context.ALARM_SERVICE); 
         alarmManager[i].set(AlarmManager.RTC, randomDates1[i], pendingIntent); 
         intentArray.add(pendingIntent); 
        } 
       } 
      } 
     } 
     intent.setClass (context, NotificationService.class); 
     context.startService(intent); 
    } 

而且在通知服务我取的意图数据如下:

Bundle b = intent.getExtras(); 
    String type = b.getString("type"); // This is line number 38. 
    Long time = intent.getLongExtra("time",1l); 

我正确地收到所有通知从活动设置警报。但得到NullpointerException

Caused by: java.lang.NullPointerException at com.example.android.basicnotifications.NotificationService.onStart(NotificationService.java:38) 

这是我从其中读额外的意向。我在这里错过了什么? 任何帮助表示赞赏。

P.S.清单文件中设置了所有必要的权限。

+0

你需要显示NotificationService.onStart()方法,特别是第38行:) – aelimill

+0

@aelimill,编辑我的代码。它显示了第38行,我收到错误。 :) – meen

回答

0

截至onReceive()结束你这样做:

intent.setClass (context, NotificationService.class); 
    context.startService(intent); 

这与不包含任何“额外”的Intent启动您Service。这会导致NullPointerException。


此外,在onReceive()你有这样的代码:

Intent myIntent = new Intent(context.getApplicationContext(), NotificationService.class); 
... 
myIntent.putExtra("type", type); 
myIntent.putExtra("time", randomDates1[i]); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, myIntent, PendingIntent.FLAG_ONE_SHOT); 

这也不能工作。当您致电PendingIntent.getBroadcast()时,会生成一个Intent,该广告将作为广播Intent发送。但是,您通过它myIntent,这是为Service,而不是BroadcastReceiver

你需要更加关注你在做什么。