重启android后无法恢复闹钟
Posted
技术标签:
【中文标题】重启android后无法恢复闹钟【英文标题】:Unable to resume alarm after reboot android 【发布时间】:2017-03-30 06:40:59 【问题描述】:我需要在重启后恢复闹钟。我在重启前在 SharedPreferences 中保存闹钟时间,重启后我设置了那个时间的闹钟,但它根本不会触发。 这是我的 Helpers 类中的警报代码:
public static void scheduleNotification(Notification notification, long delay)
Intent notificationIntent = new Intent(AppGlobals.getContext(), AlarmReceiver.class);
notificationIntent.putExtra(AlarmReceiver.NOTIFICATION_ID, 1);
notificationIntent.putExtra(AlarmReceiver.NOTIFICATION, notification);
PendingIntent pendingIntent = PendingIntent.getBroadcast(AppGlobals.getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
long futureInMillis = SystemClock.elapsedRealtime() + delay;
AlarmManager alarmManager = (AlarmManager)AppGlobals.getContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
AppGlobals.putAlarmTime(futureInMillis);
System.out.println("Alarm time before: " + futureInMillis);
我正在使用上面的代码在另一个班级重新启动之前安排警报,并且在重新启动之前它工作正常。
这是我的 AlarmReceiver 类代码:
public class AlarmReceiver extends BroadcastReceiver
public static String NOTIFICATION_ID = "notification-id";
public static String NOTIFICATION = "notification";
@Override
public void onReceive(Context context, Intent intent)
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = intent.getParcelableExtra(NOTIFICATION);
int id = intent.getIntExtra(NOTIFICATION_ID, 0);
notificationManager.notify(id, notification);
Toast.makeText(context, "Alarm!!!", Toast.LENGTH_LONG).show();
BootStateListener 类的代码:
public class BootStateListenerService extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, AppGlobals.getAlarmTime(), pendingIntent);
System.out.println("Alarm time after reboot: " + AppGlobals.getAlarmTime());
AndroidManifest 代码:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:name=".utils.AppGlobals"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".services.LocationService" />
<receiver android:name=".services.BootStateListenerService"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
<receiver android:name=".receivers.AlarmReceiver" />
</application>
在日志中重新启动后我得到了相同的时间,这意味着我的 bootstatelistener 类代码也在工作,但它根本不会发出警报。
【问题讨论】:
你的代码在我看来没问题。你能确保引导接收器正确调用并进入 onReceice() 是的,我在重启后看到了 onReceive() 的日志。 你能确定你的毫秒,即 AppGlobals.getAlarmTime() 是的,它们是一样的。我检查了三次。我在重新启动之前和之后打印警报时间,它们是 100% 相同的。我每次重启前后都会检查。 我什至没有收到我在 Alarmreceiver 课上写的祝酒词。 【参考方案1】:通过你调用 alaram 将其添加到您的活动中
ComponentName receiver = new ComponentName(Activity.this, BootStateListenerService .class);
PackageManager pm = Activity.this.getPackageManager();
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
【讨论】:
重启后我正在重置警报。你想让我在我的 BootStateListenerService 类的 onReceive() 方法中添加这些行吗? 没有。重启后你检查 SharedPreferences 给出正确的时间了吗?【参考方案2】:你能在onReceive()
里面试试这段代码吗
AlarmManager mgr=
(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, SomeActivity.class);
PendingIntent pendingIntent =PendingIntent.getService(ctxt, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME,
AppGlobals.getAlarmTime() + 10000, 10000, pendingIntent);
【讨论】:
我已经尝试过您的代码,但效果不佳。我不知道怎么了。 onReceive() 重启后被调用,重启前后的闹钟时间相同。以上是关于重启android后无法恢复闹钟的主要内容,如果未能解决你的问题,请参考以下文章