第一件事。Android 8.0 Oreo 上的隐式意图:
由于 Android 8.0(API 级别 26)引入了广播接收器的新限制,因此您应该移除所有为隐式广播意图注册的广播接收器。将它们留在原处不会在构建时或运行时破坏您的应用程序,但当您的应用程序在 Android 8.0 上运行时它们没有任何影响。显式广播意图(只有您的应用可以响应的意图)在 Android 8.0 上仍然有效。这个新限制也有例外。有关在面向 Android 8.0 的应用中仍然有效的隐式广播列表,请参阅隐式广播异常。
https://developer.android.com/about/versions/oreo/android-8.0-changes
注意:有一些例外:https ://developer.android.com/guide/components/broadcast-exceptions (很少)
相反,我们将使用所谓的上下文注册接收器,只要我们的应用程序存在,它就会持续存在,或者直到我们取消注册它。
此外,ShortcutManager
需要 API 25,这就是为什么我们将使用它的兼容版本,以免重复旧版本和新版本的代码。(ShortcutManagerCompat
在 26.1.0 版本中添加)
在主屏幕上创建固定快捷方式的代码:
public static void addShortcut(Context context, String id) {
if(context == null || note == null)
return;
//there may be various Home screen apps, better check it
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)){
Intent shortcutIntent = new Intent(context, MainActivity.class);
shortcutIntent.setAction(Constants.ACTION_SHORTCUT); // !!! intent's action must be set on oreo
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, note.get_id().toString())
.setIntent(shortcutIntent)
.setShortLabel("MyShortcut") //recommend max 10 chars
.setLongLabel("Long shortcut name")//recommend max 25 chars
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut))
.build();
//callback if user allowed to place the shortcut
Intent pinnedShortcutCallbackIntent = new Intent(ACTION_SHORTCUT_ADDED_CALLBACK);
PendingIntent successCallback = PendingIntent.getBroadcast(context, REQ_CODE_SHORTCUT_ADDED_CALLBACK,
pinnedShortcutCallbackIntent, 0);
ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, successCallback.getIntentSender());
}
例如,这是在您的 Activity 中接收广播的代码。请注意,只有当您的应用程序正在运行、接收器已注册并且用户允许使用快捷方式时,才会调用此“回调” :
private ShortcutAddedReceiver shortcutAddedReceiver;
private void registerShortcutAddedReceiver(){
if(shortcutAddedReceiver == null){
shortcutAddedReceiver = new ShortcutAddedReceiver();
}
IntentFilter shortcutAddedFilter = new IntentFilter(ShortcutHelper.ACTION_SHORTCUT_ADDED_CALLBACK);
registerReceiver(shortcutAddedReceiver, shortcutAddedFilter);
}
private void unregisterShortcutAddedReceiver(){
if(shortcutAddedReceiver != null){
unregisterReceiver(shortcutAddedReceiver);
shortcutAddedReceiver = null;
}
}
@Override
public void onStart() {
super.onStart();
registerShortcutAddedReceiver();
}
@Override
public void onStop() {
super.onStop();
unregisterShortcutAddedReceiver();
}
private class ShortcutAddedReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Snackbar.make(view, "Shortcut added", Snackbar.LENGTH_LONG).show();
}
}
希望这可以帮助!