1

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 を使用して Web サイトに誘導したり、「共有」アクションを作成したりする方法を知っています。問題は、「閉じる」メニュー項目を追加してアクティビティを閉じたり、アプリを終了したりして、より複雑なタスクを実行できるかどうかです。または、そのメニュー項目をメソッドに「接続」して、ユーザーがクリックしたときにメソッドのコードが処理されるようにします。可能であれば、2番目は最初の簡単な解決策になると思います。

答えを検索しようとしましたが、インテントまたは pendingIntent を使用してアクティビティまたはアプリ (または同様のもの) を閉じたり終了したりする方法を検索すると、「finish();」を使用して何かが得られます。または「startActivity(意図);」または同様のもので、どのように、またはどこから呼び出すかわからないため、ここでは適用できません。インテントと pendingIntent の使用について読んでみましたが、メソッドを呼び出すことができずにアクティビティやプロセスを閉じる方法がわかりません。

リソースへのリンクや、これを理解するために次に読む/学ぶ必要があるものへのポインタでさえ、助けていただければ幸いです。

4

1 に答える 1

2

このソリューションは BrodcastReceiver を使用しています。

Chrome カスタム タブ (CCT) を開始するアクティビティ (この場合は MainActivity) で、アクティビティが Broadcastreceiver から作成されたかどうかを識別するための静的フィールドと、Broadcastreceiver から設定できるようにセッターを作成します。

    // For determining if Activity was started from BroadcastReceiver
    private static boolean fromBroadcastReceiver = false;

    public static void setFromBroadcastReceiver(boolean bool) {
        fromBroadcastReceiver = bool;
    }

BroadcastReceiver のパブリック クラスを作成します。onReceive メソッドをオーバーライドして、MainActivity のインスタンスを作成し、fromBroadcastReceivertrue に設定します。次に、そのアクティビティでインテントを作成し、最初のインテントを使用して再開するための別のインテントを作成します。CCT を閉じて、後者のインテントを使用してアクティビティを再開します。

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 から作成されたかどうかを確認し、作成された場合は「フラグ」とfinish()アクティビティをリセットします。

        // Check if activity was created from the BroadcastReceiver, and if so reset the 'flag' and finish() the activity.
        if (fromBroadcastReceiver) {
            setFromBroadcastReceiver(false);
            finish();
            return;
        }

CCT のインテントと pendingIntent を作成するために BroadcastReceiver クラスを使用することを忘れないでください。

     Intent broadcastIntent =  new Intent(this, CctBroadcastReceiver.class);
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);

これで完了です。基本的に、BroadcastReceiver 内のコードは CCT を閉じます (CCT の既定の閉じるボタンをクリックした場合と同様)。MainActivity 内に「フラグ」とコードを追加すると、MainActivity がさらに閉じられます。

于 2016-05-10T21:24:22.223 に答える