查看代码示例here - 我发现以下评论令人费解:
// ... We assume here that the
// app has implemented a method called createShortcutResultIntent() that
// returns a broadcast intent.
这意味着什么应用已经实现了...... 这个实现在哪里完成了?
是广播接收器吗?注册了哪个意图过滤器?
这是一个抽象的方法吗?哪个班?
然后我看到this code sample - 它处理一个完全不同的流程(我想)而且我又迷失了
答案 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());
在此代码中,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();
}
}
}
请注意,根据我的经验,广播事件发生在添加快捷方式之后但有时可能会有一些延迟(大约几分钟)。但可能是对发射器有一些依赖。
答案 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();
}
}
希望这会有所帮助!