Android開発アート探索(ノートを読む)——02-Activityの起動モード
18361 ワード
Android開発アート探索(ノートを読む)
02-Activityの起動モード
ActivityのLaunchMode
復習:
Activity
を起動すると、システムはインスタンスを作成し、タスクスタックに入れます.タスクスタックは「後進先出」のスタック構造です.Activity
の4種類の起動モード:Activity
を起動するたびに新しいインスタンスが再作成されます.このモードでは、あるActivity
が1番Activity
を起動し、1番Activity
が起動したそのActivity
が存在するスタックで実行される.Activity
がすでにタスクスタックのスタックトップにある場合、このActivity
は再作成されず、そのonNewIntent
メソッドはコールバックされ、このメソッドのパラメータに基づいて現在のリクエストの情報を取得することができる.Activity
が1つのスタックに存在する限り、このActivity
を複数回起動してもインスタンスは再作成されず、システムはonNewIntent
を呼び出す.Activity
は、1つのタスクスタックに単独でのみ存在することができる.注意:ジャンプの場合は、まず、本
Activity
のonPause
を呼び出し、ジャンプします.ジャンプされたactivity
が起動方式のために新しいインスタンスを作成しなかった場合、onNewIntent
が呼び出され、通常のライフサイクルで呼び出されます.次のようになります.
いくつかの具体的な問題と状況
Activity
は一時停止状態にある.フロントタスクスタックABでActivity Dが開始されると、DはバックグラウンドタスクスタックCDのスタックトップとなる.バックグラウンドタスクスタック内のActivityの起動モードが
singleTask
であると仮定し、Dの起動を要求すると、バックグラウンドタスクスタック全体がフロントに切り替えられ、フロントタスクスタックのスタックトップ、すなわちABCDを直接占有する.前に起動を要求したのがCであれば、ABCになります.singleTask
モードのActivity
をスタックトップに切り替えると、その上にあるスタック内のActivity
がスタックを出ます.TaskAffinity
:タスク依存性.Activity
に必要なタスクスタックの名前を識別します.adnroid:taskAffinity="com.dimon.task1"
デフォルトでは、
Activity
に必要なタスクスタックの名前は、アプリケーションのパッケージ名です.Activityに起動モードを指定するにはどうすればいいですか?
1つ目の方法:Android MenifestでActivityの起動モードを指定します。
<activity
android:name="com.dimon.SecondActivity"
android:configChanges="screenLayout"
adnroid:taskAffinity="com.dimon.task1"
android:launchMode="singleTask"
android:label="@string/app_name"/>
第2の方法:Intentにフラグビットを設定することでActivityの起動モードを指定します。
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
区別する
FLAG_ACTIVITY_NEW_TASK
識別子を設定できませんが、2つ目はsingleTask
モードを指定できません.Acticityでよく使われるFlagsのいくつか
FLAG_ACTIVITY_NEW_TASK
このタグビットの役割は、
Activity
に「singleTask
」起動モードを指定することであり、その効果はXMLで指定した起動モードと同じである.FLAG_ACTIVITY_SINGLE_TOP
このタグビットの役割は、
Activity
に「singleTop
」起動モードを指定することであり、その効果はXMLで指定した起動モードと同じである.FLAG_ACTIVITY_CLEAR_TOP
このタグビットを持つ
Activity
は、起動すると、同じタスクスタック内のすべてのActivity
がスタックから出ます.singleTask
デフォルトでは、このタグビットの効果があります.起動されたActivity
がstandard
起動モードを採用している場合、それ以上のActivity
がスタックから出るように接続され、新しいActivity
インスタンスが作成され、スタックの上部に格納されます.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
このタグを有する
Activity
は、履歴Activity
のリストには表示されません.場合によっては、ユーザが履歴リストを介して私たちのActivity
に戻ることを望んでいない場合に便利です.XMLでActivityのプロパティandroid:excludeFromRecents="true"
を指定するのと同じです.IntentFilterの照合規則
Actionのマッチングルール
action
の適合要件Intent
のうちのaction
は存在し、フィルタリングルールの1つのaction
と同じでなければならない.大文字と小文字を区別する.categorydのマッチングルール
Intent
にcategory
が含まれている場合、category
はいずれもフィルタルールの1つcategory
と同じでなければならない.Intent
にcategory
が含まれていない場合、システムはstartActivity
またはstartActivityForResult
を呼び出すときにデフォルトでIntent
に「android.intent.category.DEFAULT
」というcategory
を加えるので、私たちのActivity
が暗黙的な呼び出しを受信できるようにするには、intent-filter
に「android.intent.category.DEFAULT
」を指定する必要があります.dataのマッチングルール
ルールは
action
と似ています.<intent-filter>
<data android:mimeType="image/*"/>
...
intent-filter>
以上の規則は、
Intent
のmimeType
属性が「image/*
」でなければ一致しないことを示しています.URI
は定義されていませんが、URI
のデフォルト値はcontent
とfile
です.すなわち、URI
がなくてもIntent
のURI
部分のschema
はcontent
またはfile
でなければ一致しない.intent.setDataAndType(uri.parse("file://abc"),"image/png");
Intentに完全なdataを指定する場合は、setDataAndTypeメソッドを呼び出す必要があります.setDataを呼び出してからsetTypeを呼び出すことはできません.この2つの方法は互いに相手の値をクリアするからです.ソースコードは次のとおりです.
public Intent setData(Uri data){
mData = data;
mType = null;
return this;
}
data
の構造はやや複雑で、文法は以下の通りである.<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"/>
data
は、mimeType
とURI
の2つの部分から構成される.mimeType
は、image/jpeg、audio/mpeg 4-generic、video/*などのメディアタイプを指す.URI
の構成は次のとおりです.://:/[||]
IntentFilter統合例
<intent-filter>
<action android:name="com.dimon.1"/>
<action android:name="com.dimon.2"/>
<category android:name="com.dimon.1a"/>
<category android:name="com.dimon.2b"/>
<category android:name="android.intent.category.DEFAULF"/>\
<data android:mimeType="text/plain"/>
intent-filter>
Intent intent = new Intent("com.dimon.1");
intent.addCategory("com.dimon.2b");
intent.setDataAndType(Uri.parse("file://abc"),"text/plain");
startActivity(intent);
Some Tips
暗黙的に
Activity
を起動する場合は、Activity
が私たちの暗黙的Intent
に一致するかどうかを判断したほうがいいです.メソッドには、
PackageManager
のresolveActivity
メソッドまたはIntent
のresolveActivity
メソッドがあり、一致しない場合はnull
に戻ります.さらに、
PackageManager
は、最適マッチングqueryIntentActivities
情報を返すのではなく、すべての成功マッチングActivity
情報を返すActivity
方法を提供する.public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags);
public abstract ResolveInfo resolveActivity(Intent intent, int flags);
2番目のパラメータは、
MATCH_DEFAULT_ONLY
というタグビットを使用します.このタグビットは、intent-filter
で
と宣言されたcategory
と一致するだけです.上記の2つの方法がActivity
を返さない限り、null
は必ず成功する.startActivity
というDEFAULT
を含まないcategory
は暗黙的Activity
を受信できないからである.前編は昨日のノートを整理して、これは今日の読書ノートです.実はね、メモといっても、実は知識点を転載しているだけで、入れない自分の理解と言えるでしょう.ノートの中の知識は私にとってすべて新しい知識で、いわゆるノートを書くのはただ自分の印象を深めるためで、後で探しやすいと言えます.
その後、いくつかのプロジェクトのメモを整理するかもしれませんが、それらのプロジェクトには自分の粗浅な理解が加わる可能性があります.
私は大学4年生で、仕事を探しています.Androidの仕事があれば、連絡してください.
あなたは私のノートを読む时、もし间违いを発见するならば、直ちにありがとうございますを指摘することを渇望します
千里の旅は足元から始まり、私はただよろよろ歩く人形で、巨人の肩の上でもっと遠くまで行けることを祈っています.