2

查看此处的代码示例- 我发现以下评论令人费解:

// ... We assume here that the
// app has implemented a method called createShortcutResultIntent() that
// returns a broadcast intent.

应用程序已实现是什么意思……这个实现是在哪里完成的?

它是广播接收器吗?注册到哪个意图过滤器?

这是一种抽象方法吗?属于哪个班级?

然后我看到了这个代码示例——它处理了一个完全不同的流程(我认为),我又迷路了

4

2 回答 2

4

requestPinShortcut您可以通过捕获您在使用函数时设置的广播事件来获得反馈。首先你需要一个普通的广播接收器(在下面的代码中它有 name ShortcutReceiver)。您甚至可以使用现有的广播接收器并简单地添加它应该捕获的新动作。
让动作将是"general.intent.action.SHORTCUT_ADDED",它将被存储在ShortcutReceiver.kInstalledAction常量中。在这种情况下,您应该在清单中拥有:

<receiver android:name=".ShortcutReceiver" >
  <intent-filter>
    <action android:name="general.intent.action.SHORTCUT_ADDED"/>
  </intent-filter>
</receiver>

在此之后,您可以在活动中使用以下代码来创建固定快捷方式(在其他地方更改Context类对象):

ShortcutManager manager = this.getSystemService(ShortcutManager.class);
Intent targetIntent = new Intent(ShortcutReceiver.kInstalledAction);
targetIntent.setPackage(this.getPackageName());
PendingIntent intent = PendingIntent.getBroadcast(this, 0, targetIntent, 0);
manager.requestPinShortcut(info, intent.getIntentSender());

在这段代码info中是正确的ShortcutInfo类对象。
您可以在捕获广播的同时处理事件:

public class ShortcutReceiver extends BroadcastReceiver {
  public static final String kInstalledAction = "general.intent.action.SHORTCUT_ADDED";

  @Override
  public void onReceive(Context context, Intent intent) {
    
    if (kInstalledAction.equals(intent.getAction())) {
      // Handle the event after the shortcut has been added 
      Toast.makeText(context, "The shortcut has been added", Toast.LENGTH_LONG).show();
    }
  
  }

}

请考虑到,根据我的经验,广播事件是在添加快捷方式后发生的,但有时可能会有一些延迟(大约几分钟)。但可能对启动器有一些依赖。

更新
如其他答案中所述,Android 8 通过广播捕获隐式意图通常不起作用。所以我通过设置当前应用程序的包名称简单地将意图更改为显式。所以只有我们的广播接收器才能捕捉到意图。

于 2018-06-15T05:53:00.483 回答
0

第一件事。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();
    }
}

希望这可以帮助!

于 2019-05-02T15:32:22.133 回答