我有一个警报,每隔15分钟重置一次数据连接。问题是,一旦手机重新启动,应用程序就会被杀死,并且警报(服务)不再触发。 (这不是重复,关于SO的其他类似问题不能解决我的问题。)
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name="com.sang.mobiledata.ResetBroadcastReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.sang.mobiledata.IntentAction.RECEIVE_RESETCONN_UPDATE" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
广播接收器:
public void onReceive(Context context, Intent intent) {
// if(CONN_ACTION.equals(intent.getAction())) {
if (intent.getAction().equalsIgnoreCase(
"com.sang.mobiledata.IntentAction.RECEIVE_RESETCONN_UPDATE")) {
MainActivity objMain = new MainActivity();
objNetwork.setMobileDataEnabled(context, false);
objNetwork.setMobileDataEnabled(context, true);
}
if (intent.getAction().equalsIgnoreCase(
"android.intent.action.BOOT_COMPLETED")) {
// code to restart/resume/retain alarm
火警警报代码(在onClick上):
Intent myIntent = new Intent(
"com.sang.mobiledata.IntentAction.RECEIVE_RESETCONN_UPDATE");
myIntent.putExtra("FLAG_KEY", false);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, myIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) this
.getSystemService(Context.ALARM_SERVICE);
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 10);
long interval = intHrs * 3600000 + intMins * 60000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), interval, pi);
long mins = interval / 60000;
Toast.makeText(
MainActivity.this,
"Data Connection will be reset every " + mins
+ " minute(s).", Toast.LENGTH_SHORT).show();
}
有什么建议吗?
答案 0 :(得分:4)
阅读AlarmManager
文档,其中写着AlarmManager
在重启后不会保留警报。
根据 Android
开发者,
...。设备处于睡眠状态时会保留已注册的警报(如果设备在此期间关闭,则可以选择将设备唤醒),但如果设备关闭并重新启动,则会清除。
关于BOOT_COMPLETED
,他们写道:
...在系统完成启动后播放一次。它可用于执行特定于应用程序的初始化,例如安装警报。您必须持有RECEIVE_BOOT_COMPLETED权限才能接收此广播。
关于许可,您已经注册了。那么可能发生的是,服务 BOOT_COMPLETED
正在本地与应用程序一起使用。移动设备的reboot
是系统活动,其未被重写以完成对正在保存的警报的重新注册。但我不确定。因此,当执行BOOT_COMPLETED
时,您需要执行某些操作。
我做的是,我使用database
注册了所有闹钟并形成SQLite
;在restart
,我用来重置所有警报。那对我有用。如果你想继续我的流程,
为警报创建数据库,并将其保存在那里。以这样的方式编写应用程序:当电话重新启动时,AlarmManager
将重置所有警报。这是它的工作原理。
再次Automatically starting Services in Android After booting。写道:
另请注意,从Android 3.0开始,用户需要在应用程序收到android.intent.action.BOOT_COMPLETED事件之前至少启动一次应用程序。