手机重启后Alarmmanager无法工作

5
我已经在按钮点击时创建了 AlarmManager,但是当手机重新启动时它不起作用。我的 AlarmBroadcastReceiver 在手机重启时没有被调用。它可以在手机锁屏或应用程序被关闭后工作,但是在手机重新启动后不能正常工作。我创建了一个进度条,当按钮被点击时开始,当闹钟广播被触发时停止,但是当手机重新启动时它无法停止。我已经添加了按钮点击事件和广播接收器类。
按钮点击事件
b1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
pb1.setVisibility(View.VISIBLE);
progress_edit.putBoolean("progress_one", true);
progress_edit.apply();
                    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                    Intent intnt = new Intent(getApplicationContext(), AlarmbroadcastReceiver.class);
                    intnt.setAction("com.ex.Alarm");
                    PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, intnt, 0);
                    manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 120000, pending);
                                Log.d("Broadcast ","Fired");
                }
            });

BroadcastReceiver类

    @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("inside","broadcast receive");
            if(intent.getAction().equalsIgnoreCase("com.ex.Alarm"))
            {
enterSys_progress_edit.putBoolean("progress_one", false);
                enterSys_progress_edit.apply();
                Toast.makeText(context,"Receive",Toast.LENGTH_LONG).show();
            }

        }

我的清单文件

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.krutarth.alarm">
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <receiver android:name=".AlarmbroadcastReceiver" android:enabled="true" android:exported="false" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
                <intent-filter >
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                </intent-filter>
            </receiver>
        </application>
    </manifest>

可能是重复的问题: 在手机重启后,AlarmManager无法触发。 - sasikumar
2个回答

8

当手机重新启动时,所有报警都会被重置,因此创建一个类似下面的回调函数:

public class BootCompletedIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
       ////// reset your alrarms here 
    }

}

同时将以下内容添加到您的清单文件中以注册广播

<receiver android:name=".receiver.BootCompletedIntentReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
</receiver>

创建一个叫做"say"的方法:

setMyalarm(){
     // here set the alarm as u need
}

现在调用setMyAlarm方法,无论何时何地,您都可以设置特定的闹钟,无论是单击按钮还是启动接收器。


如何重置警报并停止基于SharedPreferences值的进度条,我该如何更改它们?我在首选项中放置了布尔值。我有近32个不同的进度条,请帮助我。 - Madhav_nimavat
只需通过此接收器调用设置闹钟的方法,非常简单!一旦您的闹钟被重置,您的代码就可以像以前一样运行。关于sharedpreferences的设置和重置,请查看相关教程和文档。 - Ak9637
我尝试创建一个广播接收器,在设备重启时调用它,然后清除警报并放置进度条以停止,但这需要时间,例如在设备启动后至少需要12秒钟。 - Madhav_nimavat
是的,如果你在谈论重启的话,那么闹钟管理器是唯一的方法。 - Ak9637
抱歉,伙计,这是不可能的。如果答案对您有用,请接受它。不用担心,任何时候您有任何疑问,Stack上有很多人会乐意帮助您。 - Ak9637
显示剩余5条评论

3

Ak9637提供了完美的答案,但忘记添加权限。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> - Madhav_nimavat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接