java - 重启后 BroadcastReceiver 不工作

标签 java android notifications broadcastreceiver alarmmanager

我的 BroadcastReceiver 工作正常,但是当我重新启动手机时,所有通知都停止工作。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.a52780.nontifications"
    android:installLocation="internalOnly">

    <uses-permission android:name="android.permission.SET_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:roundIcon="@mipmap/ic_launcher_round"
        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=".AlarmReceiver"
            android:priority="999">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

AlarmReceiver.java

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

            // Get id & message from Intent

            int notificationId = intent.getIntExtra("notificationId", 0);
            String message = intent.getStringExtra("text");

            // when notif. is tapped, call MainActivity

            Intent mainIntent = new Intent(context, MainActivity.class);
            PendingIntent contentIntent = PendingIntent.getActivity(context, 0, mainIntent, 0);

            NotificationManager myNotificationManager =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

            // PREPARE NOTIF

            Notification.Builder builder = new Notification.Builder(context);
            builder.setSmallIcon(android.R.drawable.ic_dialog_info)
                    .setContentTitle("Wake up!")
                    .setContentText(message)
                    .setWhen(System.currentTimeMillis())
                    .setContentIntent(contentIntent);

            myNotificationManager.notify(notificationId, builder.build());
        }
}

我还尝试将 android:enabled="true"和 android:exported="false"放入接收器中。但它没有用。应用程序安装在手机内存中而不是 SD 卡上。 BroadcastReceiver 应该可以,反正重启后就不行了

最佳答案

我刚刚找到了解决方案!

AndroidManifest.xml

<receiver
        android:name="com.example.a52780.nontifications.AlarmReceiver"
        android:enabled="true"
        android:exported="false"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

    <service
        android:name="com.example.a52780.nontifications.BootService"
        android:enabled="true"
        android:exported="false"/>

我还添加了 BootService.java

private void setAlarm(Intent intent) {
    int notificationId = intent.getIntExtra("notificationId", 0);
    String text = intent.getStringExtra("text");
    Intent mainIntent = new Intent(this, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, mainIntent, 0);
    NotificationManager myNotificationManager =
            (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification.Builder builder = new Notification.Builder(this);
    builder.setSmallIcon(android.R.drawable.ic_dialog_info)
            .setContentTitle("Wake up!")
            .setContentText(text)
            .setWhen(System.currentTimeMillis())
            .setContentIntent(contentIntent);
    myNotificationManager.notify(notificationId, builder.build());
}

@Override
protected void onHandleIntent(@Nullable Intent intent) {
    setAlarm(intent);
    Intent service = new Intent(this, BootService.class);
    stopService(service);
}

AlarmReceiver.java

private static final String BOOT_COMPLETED =
        "android.intent.action.BOOT_COMPLETED";
private static final String QUICKBOOT_POWERON =
        "android.intent.action.QUICKBOOT_POWERON";

@Override
public void onReceive(Context context, Intent intent) {

    // Get id & message from Intent
    int notificationId = intent.getIntExtra("notificationId", 0);
    String message = intent.getStringExtra("text");

    String action = intent.getAction();
    if (BOOT_COMPLETED.equals(action) ||
            QUICKBOOT_POWERON.equals(action)) {

        Intent service = new Intent(context, BootService.class);

        intent.putExtra("notificationId", notificationId);
        intent.putExtra("text", message);

        context.startService(service);
    }
    }

我更改了调用 Intent 的 MainActivity 中的代码。 旧的:

Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
            intent.putExtra("notificationId", notificationId);
            intent.putExtra("text", text);
            intent.putExtra("alarmStartTime", alarmStartTime);               
            PendingIntent alarmIntent = PendingIntent.getBroadcast(MainActivity.this, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
            AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);

我不知道为什么,但是添加后就可以了

intent.setAction("android.intent.action.BOOT_COMPLETED");
intent.setAction("android.intent.action.QUICKBOOT_POWERON");

关于java - 重启后 BroadcastReceiver 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50983560/

相关文章:

java - 打印出 2 个数组列表的每个组合

android - MediaCodec getInputImage 在某些设备上返回 null

html - Facebook 通知如何在 Android 手机的 Google Chrome 上运行

java - 无法解决 Jena IRIFactory 的 NoClassDefFoundError

java - 如何返回超过 1 个值的字符串?

java - 使用 Android 进行对象跟踪

android - 如何在flutter中设置FloatingActionButton的背景透明?

objective-c - 如何捕捉 NSWorkspaceDidPerformFileOperationNotification?

android - 将我的 res/raw 包中的 mp3 添加到 Android 的铃声列表中

java - Android:是否可以下载Android自定义View的类(它是LinearLayout的扩展)并在运行时实例化它?