通知不适用于API 23

时间:2016-03-25 19:17:30

标签: android alarmmanager android-notifications android-6.0-marshmallow

我的通知不适用于API 23.

My Notfication从API 16到22

成功完成

calstd / calmin为100是默认数字。

 if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
        if(calstd==100||calmin==100){
            cancelAlarm();
        }
        else {
            onTimeSet(calstd, calmin);
        }

        pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, mainsite.class), 0);
        nm1 = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notif = new Notification.Builder(context);
        uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        notif.setContentTitle("Remind Me");
        notif.setContentText("Vergiss deine Pille nicht :)");
        notif.setSmallIcon(R.drawable.ic_launcher);
        notif.setSound(uri);
        notif.setAutoCancel(true);
        notif.setContentIntent(pendingIntent);
        nm1.notify(15, notif.build());

...
}

 public void setAlarm(Calendar targetCal) {

    intent = new Intent(contexta, AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(contexta, RQS_1, intent, 0);
    alarmManager = (AlarmManager) contexta.getSystemService(Context.ALARM_SERVICE);

    if (Build.VERSION.SDK_INT >= 19)
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
    else if (Build.VERSION.SDK_INT >= 16)
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), 1 * 1000 * 60 * 60 * 24, pendingIntent);
}

清单:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:process=":remote" android:name=".Alarm"/>

  <receiver android:name="com.victoriaremindme.AlarmReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

关闭应用后,它无法正常工作。我找不到问题。

2 个答案:

答案 0 :(得分:2)

对于setAndAllowWhileIdle()及以上,您可以使用 if (Build.VERSION.SDK_INT >= 23) alarmManager. setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); else if (Build.VERSION.SDK_INT >= 19) alarmManager.setExact(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); else if (Build.VERSION.SDK_INT >= 16) alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), 1 * 1000 * 60 * 60 * 24, pendingIntent);

所以将代码更改为

for

查看文档here

希望这有帮助。

答案 1 :(得分:1)

与23的区别在于运行时权限。您需要针对危险权限审核您的应用。由于新的api意味着如果不管理运行时权限,应用程序将不会运行许多任务,但会默默地忽略需要权限的代码或崩溃。

Requesting Permissions at Run Time

  

从Android 6.0(API级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时。

Normal and Dangerous Permissions

  
      
  • 正常权限涵盖应用程序需要访问应用程序沙箱外部数据或资源的区域,但用户隐私或其他应用程序操作的风险非常小。例如,设置时区的权限是正常权限。如果应用声明它需要正常权限,系统会自动向该应用授予权限。有关当前正常权限的完整列表,请参阅正常权限。

  •   
  • 危险权限涵盖应用程序需要涉及用户私人信息的数据或资源的区域,或者可能会影响用户存储的数据或其他应用程序的操作。例如,读取用户联系人的权限是一种危险的权限。如果应用声明需要危险权限,则用户必须明确授予该应用的权限。

  •   
     

表1.危险权限和权限组。

enter image description here