【Androidラーニングシリーズ】プロセス間でActivityを呼び出す
Activityの起動モードsingeTaskを検討していると、プロセス間でActivityを呼び出す問題が見られ、この問題を簡単にまとめ、テスト中に自分が遭遇した問題を記録します.
【プロセス間呼び出しactivity】
プロセス間でActivityを呼び出す目的は簡単です.つまり、Application AにActivityがあり、他のApplication Bに呼び出すには、2つのステップに分けて行います.
(1)アプリケーションAのマニフェストにActivityの属性を設定する
上記のコード:
a.android:exported=“true”:“True”に設定すると、Activityが外部に露出することを表す.しかし、このdemoでは、このプロパティを設定する必要がなく、demoも有効であることがわかります.これは、intentFilterが設定されている場合、exportedはfalseに強制的に設定されない限り、デフォルトでtrueに設定されます.
b.:ここではIntent対応の名前を設定し、呼び出すときにその名前が必要です.もちろんここも空いていてもいいです.(空欄の場合は、呼び出すときにactivityを呼び出すパッケージ名とクラス名を指定する必要があります.後述)
c.:data要素はデータ仕様を1つのIntentフィルタに追加するために使用され、ここでinfoを定義した場合、intentにuriを“info://”という文字を追加する必要がある.nameが空の場合、ここでも設定する必要はありません.
dataの詳細については、「http://blog.csdn.net/fireofstar/article/details/7561589
d.:startActivity()メソッドによって発行される暗黙的なIntentごとに少なくとも1つのcategoryがあり、「android.intent.category.DEFAULT」であるため、暗黙的なIntentを受信するActivityには「android.intent.category.DEFAULT」categoryが含まれるべきである.そうでないと、Intentマッチングに失敗します.上記の説明から、1、1つのIntentは複数のcategoryを有することができるが、少なくとも1つはデフォルトのcategoryであるという情報も得られる.2、ActivityはIntentのすべてのcategoryが一致している場合にのみこのIntentを受信します.
この4つの部分は登録時の主な動作ですが、aは前述したように無視できます.dは不可欠であり,少なくなると呼び出しが成功せず,Activityのエラーが見つからないことを示す.(暗黙Intentの内容について、専門の文章がありますが、前に読んだことがありますが、今はちょっと忘れていますので、次回整理します)
(2)アプリケーションBでintentを起動し、そのActivityを呼び出す
呼び出されたcodeは、以下のように簡単です.
新Intentでは、最初のパラメータは(1)で構成されたaction nameであり、両者は一致している.2つ目のパラメータはdataタイプで、前の「info://」は少なくありませんが、infoの後ろの内容は自由で、もちろん意味のある内容を追加することもできます.
もう1つの方法は、
ここでは、呼び出すActivityがどのパッケージにあるか、クラス名が何であるかを指定するだけです.すなわち、フォーマットは次のとおりです.(パッケージ名、パッケージ名+クラス名)
Application AのManifestは、次のように構成する必要があります.
つまり、Activityの名前を指定して外部に露出すればいいだけで、Intent-filterを設定する必要はありません.同様に、exportedプロパティを設定していない場合は、SubActivityへのアクセスが許可されていないというエラー権限が表示されます.空のintent-filterを設定してこのプロパティを開くこともできます.これもネット上でintent-filterが追加された例がありますが、空の列actionが1つしかないためです.
ここでもIntentの明示的、暗黙的な呼び出し方式に関係しているはずです.
【SingleTask】
既存2項目、taskA、taskB.taskAはtaskBで指定したインタフェースを呼び出す役割を果たします.taskBには3つのインタフェースがあり、a、b、cであり、各インタフェースにはtask idが表示されます.SingleTask:bインタフェースがSingleTaskとして宣言されます.まずtaskBを実行して、aインタフェースを表示して、aインタフェースからbインタフェースを呼び出して、この時bインタフェースのtaskidとaインタフェースのtaskidは一致して、bインタフェースとaインタフェースが同じtaskの中にあることを説明します;bインタフェースからcインタフェースを呼び出すと、cインタフェースのtaskidはaおよびbインタフェースのtaskidと一致し、この3つのインタフェースが同じtaskにあることを示す.現在表示されているのはcインタフェースで、この時Homeキーを押してデスクトップに戻り、taskAを実行するインタフェースはtaskBのbインタフェースを呼び出し、この時bインタフェースは表示され、そのtaskidは変わっていないのか、それとも前のtaskidなのか、ただ前に表示されているのはcインタフェースで、この時cインタフェースはすでに行方不明で、この時backキーを押すと、aインタフェースに戻り、それからtaskAのインタフェースになる.これは,SingleTaskに表記されているActivityが自身のappに呼び出された場合にtaskを新規に作成しないとともに,システムにこのSingleTaskインタフェースのインスタンスが存在する場合には,その存在するtaskをフロントに切り替え,SingleTaskインタフェースの後に開いた他のインタフェースをすべて閉じる(閉じるかどうかの検証が必要である)ことを示している.また、例えば、aインタフェースが呼び出され、ホームキーを押してデスクトップに戻り、taskAを起動し、bインタフェースを呼び出す場合、bインタフェースのtaskidとaインタフェースの一致は、bインタフェースがaインタフェースと同じtaskに属することを示す.taskA呼び出しbインタフェースを直接実行すると、bのtaskidはtaskAのインタフェースのtaskidとは異なり、新しいtaskでbインタフェースがインスタンス化され、bインタフェースからcインタフェースが呼び出され、cインタフェースのtaskidはbインタフェースと一致し、bとcが同じtaskに属することを示す.SingleInstance:bインタフェースをSingleInstanceとして宣言します.まずtaskBを実行し、aインタフェースを表示し、aインタフェースからbインタフェースを呼び出す.このとき、bインタフェースのtaskidはaインタフェースのtaskidとは異なり、bインタフェースが新しいtaskで生成された例であることを説明する.bインタフェースからcインタフェースが呼び出され、cインタフェースのtaskidはaインタフェースのtaskidと同じであり、a、cインタフェースが同じtaskに属することを示す.これにより、SingleTaskとSingleInstanceには本質的な違いがあり、ネットで言ったようにtaskのroot activityではなく、これは間違いがあることがわかります.
記事の出典:http://blog.csdn.net/wang_zun_ren/article/details/6823257
参考資料:http://www.cnblogs.com/franksunny/archive/2012/04/17/2453403.html
【プロセス間呼び出しactivity】
プロセス間でActivityを呼び出す目的は簡単です.つまり、Application AにActivityがあり、他のApplication Bに呼び出すには、2つのステップに分けて行います.
(1)アプリケーションAのマニフェストにActivityの属性を設定する
<activity
android:name=".SubActivity" // activity class name
android:exported="true">
<intent-filter>
<action android:name="net.blogjava.mobile.MYACTION"/>
<data android:scheme="info"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
上記のコード:
a.android:exported=“true”:“True”に設定すると、Activityが外部に露出することを表す.しかし、このdemoでは、このプロパティを設定する必要がなく、demoも有効であることがわかります.これは、intentFilterが設定されている場合、exportedはfalseに強制的に設定されない限り、デフォルトでtrueに設定されます.
b.
c.:data要素はデータ仕様を1つのIntentフィルタに追加するために使用され、ここでinfoを定義した場合、intentにuriを“info://”という文字を追加する必要がある.nameが空の場合、ここでも設定する必要はありません.
dataの詳細については、「http://blog.csdn.net/fireofstar/article/details/7561589
d.
この4つの部分は登録時の主な動作ですが、aは前述したように無視できます.dは不可欠であり,少なくなると呼び出しが成功せず,Activityのエラーが見つからないことを示す.(暗黙Intentの内容について、専門の文章がありますが、前に読んだことがありますが、今はちょっと忘れていますので、次回整理します)
(2)アプリケーションBでintentを起動し、そのActivityを呼び出す
呼び出されたcodeは、以下のように簡単です.
Intent i = new Intent("net.blogjava.mobile.MYACTION", Uri.parse("info://111"));
this.startActivity(i);
Log.v("HelloActivity" , "Start the new activity");
新Intentでは、最初のパラメータは(1)で構成されたaction nameであり、両者は一致している.2つ目のパラメータはdataタイプで、前の「info://」は少なくありませんが、infoの後ろの内容は自由で、もちろん意味のある内容を追加することもできます.
もう1つの方法は、
Intent intent = new Intent();
ComponentName cn=new ComponentName("com.example.phonelistenertest",
"com.example.phonelistenertest.SubActivity");
intent.setComponent(cn);
startActivity(intent);
ここでは、呼び出すActivityがどのパッケージにあるか、クラス名が何であるかを指定するだけです.すなわち、フォーマットは次のとおりです.(パッケージ名、パッケージ名+クラス名)
Application AのManifestは、次のように構成する必要があります.
<activity
android:name=".SubActivity"
android:exported="true"
>
つまり、Activityの名前を指定して外部に露出すればいいだけで、Intent-filterを設定する必要はありません.同様に、exportedプロパティを設定していない場合は、SubActivityへのアクセスが許可されていないというエラー権限が表示されます.空のintent-filterを設定してこのプロパティを開くこともできます.これもネット上でintent-filterが追加された例がありますが、空の列actionが1つしかないためです.
ここでもIntentの明示的、暗黙的な呼び出し方式に関係しているはずです.
【SingleTask】
既存2項目、taskA、taskB.taskAはtaskBで指定したインタフェースを呼び出す役割を果たします.taskBには3つのインタフェースがあり、a、b、cであり、各インタフェースにはtask idが表示されます.SingleTask:bインタフェースがSingleTaskとして宣言されます.まずtaskBを実行して、aインタフェースを表示して、aインタフェースからbインタフェースを呼び出して、この時bインタフェースのtaskidとaインタフェースのtaskidは一致して、bインタフェースとaインタフェースが同じtaskの中にあることを説明します;bインタフェースからcインタフェースを呼び出すと、cインタフェースのtaskidはaおよびbインタフェースのtaskidと一致し、この3つのインタフェースが同じtaskにあることを示す.現在表示されているのはcインタフェースで、この時Homeキーを押してデスクトップに戻り、taskAを実行するインタフェースはtaskBのbインタフェースを呼び出し、この時bインタフェースは表示され、そのtaskidは変わっていないのか、それとも前のtaskidなのか、ただ前に表示されているのはcインタフェースで、この時cインタフェースはすでに行方不明で、この時backキーを押すと、aインタフェースに戻り、それからtaskAのインタフェースになる.これは,SingleTaskに表記されているActivityが自身のappに呼び出された場合にtaskを新規に作成しないとともに,システムにこのSingleTaskインタフェースのインスタンスが存在する場合には,その存在するtaskをフロントに切り替え,SingleTaskインタフェースの後に開いた他のインタフェースをすべて閉じる(閉じるかどうかの検証が必要である)ことを示している.また、例えば、aインタフェースが呼び出され、ホームキーを押してデスクトップに戻り、taskAを起動し、bインタフェースを呼び出す場合、bインタフェースのtaskidとaインタフェースの一致は、bインタフェースがaインタフェースと同じtaskに属することを示す.taskA呼び出しbインタフェースを直接実行すると、bのtaskidはtaskAのインタフェースのtaskidとは異なり、新しいtaskでbインタフェースがインスタンス化され、bインタフェースからcインタフェースが呼び出され、cインタフェースのtaskidはbインタフェースと一致し、bとcが同じtaskに属することを示す.SingleInstance:bインタフェースをSingleInstanceとして宣言します.まずtaskBを実行し、aインタフェースを表示し、aインタフェースからbインタフェースを呼び出す.このとき、bインタフェースのtaskidはaインタフェースのtaskidとは異なり、bインタフェースが新しいtaskで生成された例であることを説明する.bインタフェースからcインタフェースが呼び出され、cインタフェースのtaskidはaインタフェースのtaskidと同じであり、a、cインタフェースが同じtaskに属することを示す.これにより、SingleTaskとSingleInstanceには本質的な違いがあり、ネットで言ったようにtaskのroot activityではなく、これは間違いがあることがわかります.
記事の出典:http://blog.csdn.net/wang_zun_ren/article/details/6823257
参考資料:http://www.cnblogs.com/franksunny/archive/2012/04/17/2453403.html