如何通过 Chrome 自定义选项卡中的 intent/pendingIntent 关闭 app/activity 或编码菜单项
How to close app/activity or code menu item via intent/pendingIntent in Chrome Custom Tabs
我正在尝试了解 Chrome 自定义标签的工作原理。按照指南,将自定义项添加到菜单是使用 pendingIntent 完成的,例如:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://google.com"));
PendingIntent pendingIntent = PendingIntent
.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
customTabsIntent = new CustomTabsIntent.Builder()
.addMenuItem("Visit Google Website", pendingIntent)
.build();
我知道如何使用 pendingIntent 定向到网站或创建 'share' 操作。问题是是否可以通过添加 'Close' 菜单项来关闭 activity 或退出应用程序来完成更复杂的任务;或 'connect' 该菜单项到一个方法,因此当用户单击它时,该方法中的代码将被处理。我猜第二个如果可能的话会比第一个简单的解决方案。
我试图搜索答案,但如果我搜索如何使用 intent 或 pendingIntent 关闭或结束 activity 或应用程序(或类似应用程序),我会使用 'finish();' 或'startActivity(intent);' 或类似的,我不能在这里应用,因为我不知道如何或从哪里调用它。我只是尝试阅读有关 intent 和 pendingIntent 的用法,但我不知道如何关闭 activity 或在无法调用方法的情况下进行处理。
我将不胜感激任何帮助,甚至是一些资源链接或指向我接下来需要 read/learn 才能理解这一点的内容的指针。
此解决方案正在使用 BrodcastReceiver:
在您开始 Chrome 自定义选项卡 (CCT) 的 activity(本例中为 MainActivity)中,创建一个静态字段以确定 activity 是否是从Broadcastreceiver 和一个 setter 所以我们可以从 Broadcastreceiver 中设置它:
// For determining if Activity was started from BroadcastReceiver
private static boolean fromBroadcastReceiver = false;
public static void setFromBroadcastReceiver(boolean bool) {
fromBroadcastReceiver = bool;
}
为 BroadcastReceiver 创建一个 public class。覆盖 onReceive 方法,创建 MainActivity 的实例并将 fromBroadcastReceiver
设置为 true。然后创建一个带有 activity 的意图和另一个使用第一个意图重新启动的意图。关闭 CCT 并使用后一个意图重新启动 activity:
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.IntentCompat;
public class CctBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Create an instance of MainActivity and set fromBroadcastReceiver flag to true.
MainActivity mainActivity = new MainActivity();
mainActivity.setFromBroadcastReceiver(true);
// Create an intent with that activity and another intent for restarting using first intent.
Intent intent = new Intent(context, mainActivity.getClass());
ComponentName compName = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(compName);
// Restart the activity using later intent (also close CCT)
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(mainIntent);
} // End onReceive.
} // End BroadcastReceiver class.
不要忘记在 AndroidManifest.xml:
中注册您的接收器
...
</activity>
<receiver
android:name=".cctBroadcastReceiver"
android:enabled="true">
</receiver>
</application>
现在,在 MainActivity 的 onCreate
中检查它是否是从 BroadcastReceiver 创建的,如果是,则重置 'flag' 和 finish()
activity:
// Check if activity was created from the BroadcastReceiver, and if so reset the 'flag' and finish() the activity.
if (fromBroadcastReceiver) {
setFromBroadcastReceiver(false);
finish();
return;
}
不要忘记使用 BroadcastReceiver class 为 CCT 创建 intent 和 pendingIntent:
Intent broadcastIntent = new Intent(this, CctBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
大功告成。基本上 BroadcastReceiver 中的代码会关闭 CCT(类似于您单击 CCT 默认关闭按钮)。在 MainActivity 中添加 'flag' 和代码进一步关闭 MainActivity。
我正在尝试了解 Chrome 自定义标签的工作原理。按照指南,将自定义项添加到菜单是使用 pendingIntent 完成的,例如:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://google.com"));
PendingIntent pendingIntent = PendingIntent
.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
customTabsIntent = new CustomTabsIntent.Builder()
.addMenuItem("Visit Google Website", pendingIntent)
.build();
我知道如何使用 pendingIntent 定向到网站或创建 'share' 操作。问题是是否可以通过添加 'Close' 菜单项来关闭 activity 或退出应用程序来完成更复杂的任务;或 'connect' 该菜单项到一个方法,因此当用户单击它时,该方法中的代码将被处理。我猜第二个如果可能的话会比第一个简单的解决方案。
我试图搜索答案,但如果我搜索如何使用 intent 或 pendingIntent 关闭或结束 activity 或应用程序(或类似应用程序),我会使用 'finish();' 或'startActivity(intent);' 或类似的,我不能在这里应用,因为我不知道如何或从哪里调用它。我只是尝试阅读有关 intent 和 pendingIntent 的用法,但我不知道如何关闭 activity 或在无法调用方法的情况下进行处理。
我将不胜感激任何帮助,甚至是一些资源链接或指向我接下来需要 read/learn 才能理解这一点的内容的指针。
此解决方案正在使用 BrodcastReceiver:
在您开始 Chrome 自定义选项卡 (CCT) 的 activity(本例中为 MainActivity)中,创建一个静态字段以确定 activity 是否是从Broadcastreceiver 和一个 setter 所以我们可以从 Broadcastreceiver 中设置它:
// For determining if Activity was started from BroadcastReceiver
private static boolean fromBroadcastReceiver = false;
public static void setFromBroadcastReceiver(boolean bool) {
fromBroadcastReceiver = bool;
}
为 BroadcastReceiver 创建一个 public class。覆盖 onReceive 方法,创建 MainActivity 的实例并将 fromBroadcastReceiver
设置为 true。然后创建一个带有 activity 的意图和另一个使用第一个意图重新启动的意图。关闭 CCT 并使用后一个意图重新启动 activity:
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.IntentCompat;
public class CctBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Create an instance of MainActivity and set fromBroadcastReceiver flag to true.
MainActivity mainActivity = new MainActivity();
mainActivity.setFromBroadcastReceiver(true);
// Create an intent with that activity and another intent for restarting using first intent.
Intent intent = new Intent(context, mainActivity.getClass());
ComponentName compName = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(compName);
// Restart the activity using later intent (also close CCT)
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(mainIntent);
} // End onReceive.
} // End BroadcastReceiver class.
不要忘记在 AndroidManifest.xml:
中注册您的接收器...
</activity>
<receiver
android:name=".cctBroadcastReceiver"
android:enabled="true">
</receiver>
</application>
现在,在 MainActivity 的 onCreate
中检查它是否是从 BroadcastReceiver 创建的,如果是,则重置 'flag' 和 finish()
activity:
// Check if activity was created from the BroadcastReceiver, and if so reset the 'flag' and finish() the activity.
if (fromBroadcastReceiver) {
setFromBroadcastReceiver(false);
finish();
return;
}
不要忘记使用 BroadcastReceiver class 为 CCT 创建 intent 和 pendingIntent:
Intent broadcastIntent = new Intent(this, CctBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
大功告成。基本上 BroadcastReceiver 中的代码会关闭 CCT(类似于您单击 CCT 默认关闭按钮)。在 MainActivity 中添加 'flag' 和代码进一步关闭 MainActivity。