1

Chromeのカスタムタブの仕組みを理解しようとしています。など、メニューにカスタム項目を追加することがpendingIntentを使用して行われ、ガイドラインに従って:Chromeのカスタムタブでintent/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を使用するか、「共有」アクションを作成する方法を知っています。問題は、アクティビティを閉じるために「閉じる」メニューアイテムを追加するか、アプリを終了することから、より複雑なタスクを実行することが可能であるかどうかです。そのメニュー項目をメソッドに「接続」するため、ユーザーがそのメニュー項目をクリックすると、そのメソッドのコードが処理されます。可能であれば、第2のものは、第1のもののための簡単な解決策を作るよりも簡単だろう。

回答を検索しようとしましたが、意図やpendingIntentを使用してアクティビティやアプリケーション(または同様のもの)をクローズまたは終了する方法を検索すると、「finish();」を使用して何かを取得します。または 'startActivity(インテント);どのようにしてどこから呼び出すかわからないので、ここでは適用できません。私はインテントとpendingIntentの使用について読んだだけですが、メソッドを呼び出せずにクローズ・アクティビティや処理を行う方法を理解することはできません。

これを理解できるようにするためには、私が読んだり、次に習得しなければならないことについて、何か助けてください。

+0

達成しようとしている動作をよりよく説明できますか?カスタムタブを呼び出すアクティビティを終了させるボタンがCCTに表示されているようです – andreban

+0

@andreban:デバイスにChromeがない場合、アプリはユーザーのデフォルトブラウザでリンクを開きます。その場合、「タスクマネージャー」を開いてデバイス上で「実行中のアプリケーション」を見ると、アプリケーションとユーザーの両方のブラウザーが実行されています。Chromeバージョン45以上が端末にインストールされ、デフォルトのブラウザとして選択されている場合、CCTが開き、 'タスクマネージャー'を開いて '実行中のアプリ'を表示すると、アプリのみが表示されます(CCTが開く - Chromeブラウザは起動していません)。 – Vlad

+0

@andreban:そうです、私は、必ずしもボタンではなく、CCTメニューにカスタムメニュー項目を追加しようとしています。アプリを閉じると、CCTがよく私が知る限り、上記の例で説明したように、どちらもintent/pendIntentによって制御されているので、カスタムアクションボタンを使用してそれを実行したいと思うのと同じだと思います。 – Vlad

答えて

0

このソリューションは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がさらに閉じられます。

+0

'browserActivity'とは何ですか? –

+0

@qbix:申し訳ありませんが、mainActivityである必要があります。私はそれを変えた。ありがとう。 – Vlad

関連する問題