Android 重启后在接收器中获得额外的
Android get extra in receiver after reboot
我正在开发一个提醒用户的应用程序。它运行良好,但是当我设置它并重新启动设备时 returns 收到通知时为空。我认为问题出在广播接收器上。因为无法从 intent extra 中获取任何字符串。
--在activity--
private void setAlarm() {
Intent myIntent = new Intent(this, AlarmReceiver.class);
String data = descripton.getText().toString();
Bundle b = new Bundle();
b.putString("notify_message", data);
myIntent.putExtras(b);
pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);
}
-- 清单 --
<receiver android:name=".ekstra.AlarmReceiver"
android:enabled="true"
android:exported="true"
android:label="StartMyServiceAtBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
--广播接收器--
@Override
public void onReceive(Context context, Intent intent) {
try {
Bundle extras = intent.getExtras();
//Afret reboot test1 and test2 is null
String test1 = extras.getString("notify_message");
String test2 = intent.getStringExtra("notify_message");
Intent newIntent = new Intent(context, RemindingService.class);
newIntent.putExtra("messaage", message);
context.startService(newIntent);
} catch (Exception e) {
Log.e("Test", "error " + e.toString());
}
}
如上所述,重启后您将收不到广播。
但是在这里,如果您在引导完成时调用相同的 AlarmReceiver,这是由系统广播的那么那里,下面将 return null
String test1 = extras.getString("notify_message");//test1 is null
或
String test2 = intent.getStringExtra("notify_message");//test2 is null
(两个调用是等价的)
因此,您应该根据 Receiver 是在启动后调用还是由于 Alarm 调用来执行您的逻辑。你可以在你的 AlarmReceiver 中做这样的事情:
String msg = intent.getStringExtra("notify_message");
if(msg==null){
//means that receiver started after boot
// write your logic here
}else{
//means that receiver started by alarm
//write your logic here
}
我正在开发一个提醒用户的应用程序。它运行良好,但是当我设置它并重新启动设备时 returns 收到通知时为空。我认为问题出在广播接收器上。因为无法从 intent extra 中获取任何字符串。
--在activity--
private void setAlarm() {
Intent myIntent = new Intent(this, AlarmReceiver.class);
String data = descripton.getText().toString();
Bundle b = new Bundle();
b.putString("notify_message", data);
myIntent.putExtras(b);
pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);
}
-- 清单 --
<receiver android:name=".ekstra.AlarmReceiver"
android:enabled="true"
android:exported="true"
android:label="StartMyServiceAtBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
--广播接收器--
@Override
public void onReceive(Context context, Intent intent) {
try {
Bundle extras = intent.getExtras();
//Afret reboot test1 and test2 is null
String test1 = extras.getString("notify_message");
String test2 = intent.getStringExtra("notify_message");
Intent newIntent = new Intent(context, RemindingService.class);
newIntent.putExtra("messaage", message);
context.startService(newIntent);
} catch (Exception e) {
Log.e("Test", "error " + e.toString());
}
}
如上所述,重启后您将收不到广播。 但是在这里,如果您在引导完成时调用相同的 AlarmReceiver,这是由系统广播的那么那里,下面将 return null
String test1 = extras.getString("notify_message");//test1 is null
或
String test2 = intent.getStringExtra("notify_message");//test2 is null
(两个调用是等价的)
因此,您应该根据 Receiver 是在启动后调用还是由于 Alarm 调用来执行您的逻辑。你可以在你的 AlarmReceiver 中做这样的事情:
String msg = intent.getStringExtra("notify_message");
if(msg==null){
//means that receiver started after boot
// write your logic here
}else{
//means that receiver started by alarm
//write your logic here
}