android - 重启手机后报警通知数据消失
问题描述
我正在构建一个通知应用程序,它使用警报管理器设置多个通知以提醒用户日常任务,当手机开机时一切都很好,但是当重启手机时,通知显示但通知数据丢失(对于示例通知内容)这些数据从我的第一个活动中保存到意图中,这是下面的代码。(我已向我的清单添加权限并接收操作)请我需要一些帮助
public class add_rreminde extends AppCompatActivity implements View.OnClickListener{
private int notificationId=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_rreminde);
//buton ok
findViewById(R.id.but).setOnClickListener(this);
findViewById(R.id.cancel).setOnClickListener(this);
}
@Override
public void onClick(View view){
EditText remide=findViewById(R.id.edit);
DatePicker date=findViewById(R.id.date);
Intent intent=new Intent(add_rreminde.this,AlarmReciver.class);
intent.putExtra("notificationId",notificationId);
intent.putExtra("todo",remide.getText().toString());
final int _id=(int)System.currentTimeMillis();
PendingIntent alarmIntent=PendingIntent.getBroadcast(add_rreminde.this,_id,intent,PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
switch (view.getId()){
case(R.id.but):
int day=date.getDayOfMonth();
int month=date.getMonth();
int year=date.getYear();
//create date
Calendar startDate=Calendar.getInstance();
startDate.set(Calendar.DAY_OF_MONTH,day);
startDate.set(Calendar.MONTH,month);
startDate.set(Calendar.YEAR,year);
Long alarmStartDate=startDate.getTimeInMillis();
//setAlarme
alarm.set(AlarmManager.RTC_WAKEUP,alarmStartDate,alarmIntent);
Toast.makeText(getApplicationContext(),"done",Toast.LENGTH_LONG).show();
break;
case (R.id.cancel):
alarm.cancel(alarmIntent);
Toast.makeText(getApplicationContext(),"canceled",Toast.LENGTH_LONG).show();
break;
}
}
}
我的接收者推送通知
public class AlarmReciver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//get id from notification id intent
int notification =intent.getIntExtra("notificationId",0);
String getMessage=intent.getStringExtra("todo");
//when notification is opened open mainActivity
Intent mainIntent=new Intent(context,add_rreminde.class);
PendingIntent contentIntent=PendingIntent.getActivity(context,0,mainIntent,0);
NotificationManager mynotificationManager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
//prepare notification
Notification.Builder builder=new Notification.Builder(context);
builder.setSmallIcon(R.drawable.assistant)
.setContentTitle("changer oil")
.setContentText(getMessage)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setContentIntent(contentIntent)
.setPriority(Notification.PRIORITY_MAX)
.setDefaults(Notification.DEFAULT_ALL);
//notify
mynotificationManager.notify(notification,builder.build());
}
}
解决方案
默认情况下,设备关闭时会取消所有警报。为了防止这种情况发生,您可以将您的应用程序设计为在用户重新启动设备时自动重新启动重复警报。
所以你可以添加一个BroadcastReceiver
接收ACTION_BOOT_COMPLETED
第一:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
和:
<receiver android:name=".SampleBootReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
现在您在设备重启时再次设置警报:
public class SampleBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
// Set the alarm here.
}
}
}
推荐阅读
- apache-spark - 基于 Spark 处理存储在 SSD 上的数据
- mongodb - 为什么 mongodb 不关心我的配置文件是什么?
- php - magento2 创建了自定义产品属性,但在批量更新中丢失
- python - 查找跨多个列的条目之间的日期差异
- c - 如何避免在C中将字符串作为数组循环?
- php - PHP 无法运行 python 文件。否 模块错误
- reactjs - 重新绘制图表上方的图例
- android - ScrollView 在协调器和相对布局中不起作用
- google-analytics - 无法从底部有 google 脚本的 URL 获取 HTML?
- java - 错误:链接引用失败(Android Studio)