如何通过 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。