Android Activity暗黙的起動の包括的な解析

8316 ワード

前言
AndroidはActivityを起動する2つの方法があり、1つは起動を表示することであり、もう1つは暗黙的に起動することである.起動はプロジェクトでよく使われていることを示しています.皆さんもよく知っています.今日は主に暗黙的な起動について説明します.暗黙的な起動は、異なるアプリケーション間のジャンプ(例えば、支付宝微信の支払いページを開く)によく用いられ、H 5とnativeとの相互作用にも用いることができる.暗黙的な起動はaction,category,dataのマッチングであり,まずマッチングのルールを説明し,具体的な例で検証する.
一致規則
  • actionのマッチングルール
  • actionはIntent-filterで複数の
  • を設定できる.
  • intentでactionを指定する必要があります.そうしないと、マッチングに失敗し、intentのactionは最大
  • しかありません.
  • intentのactionとintent-filterのactionが完全に同じである必要がある場合(大文字と小文字を含む)は、一致が成功した
  • と計算する.
  • intentのactionはintent-filterの1つと一致すれば
  • である.
    
        
            
            
        
    
        
            
            
            
        
    
    

    次の2つのintentは、上のMainActivityのactionルールに一致します.
    Intent intent = new Intent("com.jrmf360.action.ENTER");
    startActivity(intent);
    
    Intent intent2 = new Intent("com.jrmf360.action.ENTER2");
    startActivity(intent2);
    
  • categoryのマッチング規則
  • categoryはintent-filterに複数の
  • を有することができる.
  • category intentには
  • が複数あるもよい.
  • intentのすべてのcategoryはintent-filterで同じ(大文字と小文字を含む)を見つけることができて、一致に成功した
  • を計算します.
  • intentでActivityを起動するときcategoryを追加しないとandroid.intent.category.DEFAULTが自動的に追加され、intent-filterにandroid.intent.category.DEFAULTが追加されていない場合は
  • に一致しません.
  • dataのマッチングルールdataのマッチングルールを話す前に、まずdataの構文
  • についてお話しします.
    
    

    くりを一つあげる
    scheme://host:port/path|pathPrefix|pathPattern
    jrmf://jrmf360.com:8888/first
    

    scheme:jrmf host:jrmf 360.com port:ポート番号、例えば8888 path:パス、例えばfirst pathPrefix:一部のパスが指定されている場合、first pathPattern:指定されたパスはfirst mimeType:処理されたデータ型、例えばimage/*
  • intent-filterでは複数のdata
  • を設定できる.
  • intentには1つのdata
  • しか設定できません.
  • intent-filterでdataが指定する、intentでその中の1つを指定するdata
  • .
  • setTypeはsetDataを上書きし、setDataはsetTypeを上書きするので、setDataAndTypeメソッドを使用してdataとmimeType
  • を設定する必要があります.
    インスタンス検証
    2つのプロジェクトexternalstart 1とexternalstart 2を新規作成し、externalstart 1にいくつかのbuttonを追加し、buttonをクリックして暗黙的に起動してexternalstart 2のActivityを開きます.まずexternalstart 2の暗黙的な起動の構成を見てみましょう.
    
        
            
            
        
    
        
            
            
            
        
    
    
    
    
    
    
    
    

    externalstart 2プロジェクトには、MainActivity、FirstActivity、SecondActivityの3つのActivityがあります.externalstart 1プロジェクトは暗黙的起動によってMainActivityにジャンプし、MainActivityで暗黙的起動によって伝達されたパス(path)によってFirstActivityまたはSecondActivityを開く.MainActivityのコードは次のとおりです.
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            parseData();
        }
    
        private void parseData() {
            Uri data = getIntent().getData();
            if (data != null){
                String scheme = data.getScheme();
                String host = data.getHost();
                int port = data.getPort();
                String path = data.getPath();
                String query = data.getQuery();
                String message = data.getQueryParameter("message");
                Log.e(getClass().getSimpleName(),"scheme:"+scheme);
                Log.e(getClass().getSimpleName(),"host:"+host);
                Log.e(getClass().getSimpleName(),"port:"+port);
                Log.e(getClass().getSimpleName(),"path:"+path);
                Log.e(getClass().getSimpleName(),"query:"+query);
    
                if ("/first".equals(path)){
                    FirstActivity.intent(this,message);
                    finish();
                }else if ("/second".equals(path)){
                    SecondActivity.intent(this,message);
                    finish();
                }
            }
        }
    }
    

    pathがfirstの場合FirstActivityにジャンプし、pathがsecondの場合SecondActivityにジャンプし、dataの各部分のログを印刷します.externalstart 1でボタンをクリックしてexternalstart 2プロジェクトにジャンプし、externalstart 1のボタンのクリックロジックを見てみましょう.
    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn_firstActivity){
            Intent intent = new Intent();
            intent.setAction("com.jrmf360.action.ENTER");
            intent.setData(Uri.parse("jrmf://jrmf360.com:8888/first?message=Hello FirstActivity"));
            startActivity(intent);
    
        }else if (id == R.id.btn_secondActivity){
            Intent intent = new Intent();
            intent.setAction("com.jrmf360.action.ENTER");
            intent.setData(Uri.parse("jrmf://jrmf360.com:8888/second?message=Hello SecondActivity"));
            startActivity(intent);
        }else if (id == R.id.btn_mainActivity){
            Intent intent = new Intent("com.jrmf360.action.ENTER");
            intent.setData(Uri.parse("jrmf://jrmf360.com:8888"));
            startActivity(intent);
        }
    }
    

    ボタンの名前から各ボタンがジャンプするActivityがわかりやすい.クリックテストを行います.
  • btn_をクリックmainActivityはMainActivityにジャンプします.印刷されたログを見て、
  • ページを貼りません.
    07-27 17:38:14.224 6568-6568/com.jrmf360.externalstart2 E/MainActivity: scheme:jrmf
    07-27 17:38:14.224 6568-6568/com.jrmf360.externalstart2 E/MainActivity: host:jrmf360.com
    07-27 17:38:14.224 6568-6568/com.jrmf360.externalstart2 E/MainActivity: port:8888
    07-27 17:38:14.224 6568-6568/com.jrmf360.externalstart2 E/MainActivity: path:/
    07-27 17:38:14.224 6568-6568/com.jrmf360.externalstart2 E/MainActivity: query:null
    

    pathもqueryも空であることがわかります
  • btn_をクリックfirstActivityは、まずMainActivityページにジャンプし、渡されたpathに従ってFirstActivityを開き、ログ
  • を参照します.
    07-27 17:39:49.145 6568-6568/com.jrmf360.externalstart2 E/MainActivity: scheme:jrmf
    07-27 17:39:49.145 6568-6568/com.jrmf360.externalstart2 E/MainActivity: host:jrmf360.com
    07-27 17:39:49.145 6568-6568/com.jrmf360.externalstart2 E/MainActivity: port:8888
    07-27 17:39:49.145 6568-6568/com.jrmf360.externalstart2 E/MainActivity: path:/first
    07-27 17:39:49.145 6568-6568/com.jrmf360.externalstart2 E/MainActivity: query:message=Hello FirstActivity
    
    

    ログからpathがFirst、queryがmessage=Hello FirstActivityと表示されるため、FirstActivityが開き、message Hello FirstActivityが渡されます.
  • btn_をクリックSecondActivityは、まずMainActivityページにジャンプし、渡されたpathに従ってSecondActivityを開きます.ログを見てください.
  • 07-27 17:41:56.712 6568-6568/com.jrmf360.externalstart2 E/MainActivity: scheme:jrmf
    07-27 17:41:56.712 6568-6568/com.jrmf360.externalstart2 E/MainActivity: host:jrmf360.com
    07-27 17:41:56.712 6568-6568/com.jrmf360.externalstart2 E/MainActivity: port:8888
    07-27 17:41:56.712 6568-6568/com.jrmf360.externalstart2 E/MainActivity: path:/second
    07-27 17:41:56.712 6568-6568/com.jrmf360.externalstart2 E/MainActivity: query:message=Hello SecondActivity
    07
    

    ログからpathがsecond、queryがmessage=Hello SecondActivityと表示されるため、SecondActivityが開き、message Hello SecondActivityが渡されます.
    その他の事項
  • android.intent.action.MAIN:プログラムが最初に起動したActivityは、複数のActivityに
  • を設定できます.
  • android.intent.category.LAUNCHER:アプリケーションがデスクトップに表示されているかどうかは、複数のActivity構成
  • を使用できます.
  • android.intent.action.MAINとandroid.intent.category.LAUNCHERの同時設定launcherにアプリケーションアイコンが表示され、android.intent.category.LAUNCHERにはアイコンが表示されず、アプリケーションの少なくともペアが必要です.複数のペアを設定することで、システムのデスクトップにアプリケーションアイコンが表示されます.

  • 暗黙的に起動する知識点は終わり、新しい姿勢をもっと適用して掘り起こすのを待っています.