このソリューションは 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 のインスタンスを作成し、fromBroadcastReceiver
true に設定します。次に、そのアクティビティでインテントを作成し、最初のインテントを使用して再開するための別のインテントを作成します。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 がさらに閉じられます。