このソリューションはBrodcastReceiverを使用している:あなたの活動で
あなたはクロームカスタムタブを始めていたから(この場合はMainActivity)(CCT)、活動が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であなたの受信機に登録することを忘れないでください:それが作成された場合MainActivityチェックのonCreate
内部で、今
...
</activity>
<receiver
android:name=".cctBroadcastReceiver"
android:enabled="true">
</receiver>
</application>
をそう「フラグ」とfinish()
活動をリセットBroadcastReceiverから、及び場合:
// 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 cを使用することを忘れないでください。意図を作成してCCTの保留中です。
Intent broadcastIntent = new Intent(this, CctBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
これで完了です。基本的には、BroadcastReceiver内のコードはCCTを閉じます(CCTのデフォルトクローズボタンをクリックした場合と同様です)。 MainActivity内の 'フラグ'とコードを追加すると、MainActivityがさらに閉じられます。
達成しようとしている動作をよりよく説明できますか?カスタムタブを呼び出すアクティビティを終了させるボタンがCCTに表示されているようです – andreban
@andreban:デバイスにChromeがない場合、アプリはユーザーのデフォルトブラウザでリンクを開きます。その場合、「タスクマネージャー」を開いてデバイス上で「実行中のアプリケーション」を見ると、アプリケーションとユーザーの両方のブラウザーが実行されています。Chromeバージョン45以上が端末にインストールされ、デフォルトのブラウザとして選択されている場合、CCTが開き、 'タスクマネージャー'を開いて '実行中のアプリ'を表示すると、アプリのみが表示されます(CCTが開く - Chromeブラウザは起動していません)。 – Vlad
@andreban:そうです、私は、必ずしもボタンではなく、CCTメニューにカスタムメニュー項目を追加しようとしています。アプリを閉じると、CCTがよく私が知る限り、上記の例で説明したように、どちらもintent/pendIntentによって制御されているので、カスタムアクションボタンを使用してそれを実行したいと思うのと同じだと思います。 – Vlad