【问题标题】:Not getting Notification through Broadcast receiver in Android Version above 6.0在 6.0 以上的 Android 版本中无法通过广播接收器获取通知
【发布时间】:2019-11-28 03:50:21
【问题描述】:

我正在尝试使用 SQLite 数据库构建离线提醒 Android 应用程序。对于通知,我使用警报管理器调用广播接收器,但不幸的是,接收器未触发,因此我无法在更高版本 6.0 及更高版本中获得提醒通知

我的清单包括:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />

还有

enter code here
   <receiver
        android:name=".Util.BroadcastManager"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.NOTIFY" />
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
            <!--
            <action android:name="ALARM" />
            <action android:name = "android.hardware.usb.action.USB_STATE" />
            <category android:name="android.intent.category.APP_CALENDAR" />
            -->
        </intent-filter>
    </receiver>

报警管理器调用为:

           if (alarm) {
        Intent itAlarm = new Intent("ALARM");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, itAlarm, 0);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 3);
        AlarmManager alarme = (AlarmManager) getSystemService(ALARM_SERVICE);
        int interval = 60000;
        alarme.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
    }else {
        Intent alarmIntent = new Intent(MainActivity.this, BroadcastManager.class);
        alarmIntent.setAction(Intent.ACTION_MAIN);
        alarmIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);

        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        int interval = 60000;

        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
    }

    br = new BroadcastManager();
    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    this.registerReceiver(br, filter);

【问题讨论】:

  • 我不确定您的 alarm 变量表示什么,但在这两种情况下您都应该使用明确的 Intent;即,new Intent(MainActivity.this, BroadcastManager.class) 在第一种情况下也是如此,而不是 new Intent("ALARM")
  • 这条线没有用,虽然没有调用广播管理器。
  • 我不知道那是什么意思。无论如何,关于警报或接收器,Android 6 没有任何变化。 Android 8 对清单注册的接收器引入了隐式广播的限制,但无论如何,您应该一直使用显式广播。 6 中的主要变化是运行时权限,因此如果您的 Receiver 中有需要危险权限的内容,则可能是失败的原因。您需要edit 您的问题,以提供证明问题的minimal reproducible example

标签: java android notifications broadcastreceiver android-version


【解决方案1】:

尝试使用通知库来制作适用于每个 API 的自定义通知。

警报通知

这是一个自定义库

implementation "com.tapadoo.android:alerter:5.0.0"

Here is the link

我在我当前的项目中使用它,它运行良好。

【讨论】:

  • 警报管理器无法正常工作以在特定时间触发通知
  • 应用程序未运行时警报管理器未触发广播接收器,我已授予自动运行权限
  • 我认为您需要在后台线程中运行警报管理器,这就是为什么在应用程序处于后台时警报管理器不调用的原因;)[stackoverflow.com/questions/15472383/…
  • 我已经尝试使用线程和处理程序,但仍然没有得到预期的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多