Android - 如何接收快捷方式创建结果

时间:2018-06-13 17:01:14

标签: android android-8.0-oreo android-shortcut android-shortcutmanager

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

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

这意味着什么应用已经实现了...... 这个实现在哪里完成了?

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

这是一个抽象的方法吗?哪个班?

然后我看到this code sample - 它处理一个完全不同的流程(我想)而且我又迷失了

2 个答案:

答案 0 :(得分:2)

您可以通过捕捉使用requestPinShortcut功能时设置的广播事件来获取反馈。 首先,您需要一个普通的广播接收器(在下面的代码中它有名称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);
PendingIntent intent = PendingIntent.getBroadcast(this, 0, new Intent(ShortcutReceiver.kInstalledAction), 0);
manager.requestPinShortcut(info, intent.getIntentSender());

在此代码中,infoShortcutInfo类的正确对象。
您可以在捕捉广播时处理该事件:

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();
    }

  }

}

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

答案 1 :(得分: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,这就是为什么我们将使用它的compat版本,以便不重复旧版本和新版本的代码。 (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());
    }

例如,这是在“活动”中接收广播的代码。请注意,只有在您的应用程序正在运行,接收者已注册并且用户允许快捷方式时,才会调用此“回调”:

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();
    }
}

希望这会有所帮助!