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ルールに一致します. 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: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のコードは次のとおりです.
pathがfirstの場合FirstActivityにジャンプし、pathがsecondの場合SecondActivityにジャンプし、dataの各部分のログを印刷します.externalstart 1でボタンをクリックしてexternalstart 2プロジェクトにジャンプし、externalstart 1のボタンのクリックロジックを見てみましょう.
ボタンの名前から各ボタンがジャンプするActivityがわかりやすい.クリックテストを行います. btn_をクリックmainActivityはMainActivityにジャンプします.印刷されたログを見て、 ページを貼りません.
pathもqueryも空であることがわかります btn_をクリックfirstActivityは、まずMainActivityページにジャンプし、渡されたpathに従ってFirstActivityを開き、ログ を参照します.
ログからpathがFirst、queryがmessage=Hello FirstActivityと表示されるため、FirstActivityが開き、message Hello FirstActivityが渡されます. btn_をクリックSecondActivityは、まずMainActivityページにジャンプし、渡されたpathに従ってSecondActivityを開きます.ログを見てください.
ログから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にはアイコンが表示されず、アプリケーションの少なくともペアが必要です.複数のペアを設定することで、システムのデスクトップにアプリケーションアイコンが表示されます.
暗黙的に起動する知識点は終わり、新しい姿勢をもっと適用して掘り起こすのを待っています.
AndroidはActivityを起動する2つの方法があり、1つは起動を表示することであり、もう1つは暗黙的に起動することである.起動はプロジェクトでよく使われていることを示しています.皆さんもよく知っています.今日は主に暗黙的な起動について説明します.暗黙的な起動は、異なるアプリケーション間のジャンプ(例えば、支付宝微信の支払いページを開く)によく用いられ、H 5とnativeとの相互作用にも用いることができる.暗黙的な起動はaction,category,dataのマッチングであり,まずマッチングのルールを説明し,具体的な例で検証する.
一致規則
次の2つのintentは、上のMainActivityのactionルールに一致します.
Intent intent = new Intent("com.jrmf360.action.ENTER");
startActivity(intent);
Intent intent2 = new Intent("com.jrmf360.action.ENTER2");
startActivity(intent2);
くりを一つあげる
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/*
インスタンス検証
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がわかりやすい.クリックテストを行います.
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も空であることがわかります
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が渡されます.
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が渡されます.
その他の事項
暗黙的に起動する知識点は終わり、新しい姿勢をもっと適用して掘り起こすのを待っています.