1. activity的描述
(1) An activity provides the window in which the app draws its UI
(2) one activity implements one screen in an app (Activity 表示应用中的一个屏幕)
2. 启动activity
(1) 显式:直接指定类名
private void showDeliveryReport(long messageId, String type) {
Intent intent = new Intent(this, DeliveryReportActivity.class);
intent.putExtra("message_id", messageId);
intent.putExtra("message_type", type);
startActivity(intent);
}
(2)隐式:通过action
public static void capturePicture(Activity activity, int requestCode) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, TempFileProvider.SCRAP_CONTENT_URI);
activity.startActivityForResult(intent, requestCode);
}
3. configChanges
android:configChanges="orientation|screenSize"
如果不添加上面两个配置项,在屏幕横竖屏切换时,会执行完整的界面destory过程,再重新创建
onPause
onStop
onDestroy
onCreate
4.启动模式
(1) standard
每次启动都会启动一个新的页面
(2) singleTop(顶端只有一个)
-
如果在任务栈的栈顶已经存在该activity,那么再次启动该activity,不会新创建该activity,而是会调用该activity的onPause和onNewIntent方法,复用栈顶的这个activity。
-
如果已经存在的activity不在任务栈的栈顶,则会新建一个
(3) singleTask(整个task只有一个)
-
如果在任务栈的栈顶已经存在该activity,那么再次启动该activity,不会新创建该activity,而是会调用该activity的onPause和onNewIntent方法,复用栈顶的这个activity。
-
如果已经存在的activity不在任务栈的栈顶,
在它之上的所有activity被销毁:
onPause
onStop
onDestory -
它自己被推到栈顶:
onNewIntent
onRestart
onStart
(4) singleInstance(整个系统只有一个)
-
首次启动它时,会新建一个任务栈,并且这个任务栈只有它一个Activity。
-
再次启动它时,会复用之前启动的activity。
如果直接在该activity上再启动该activity,会执行下面方法
onPause
onNewIntent
如果别的activity在最上面,然后启动它,会执行下面方法
onNewIntent
onRestart
onStart
- 通过adb shell dumpsys activity activities打印任务栈
启动MainActivity后,堆栈情况:
Task id #16978
* Hist #0: ActivityRecord{45f06ce u0 com.test.demo/.MainActivity t16978}
在MainActivity上面,启动TestActivity
Task id #16979
* Hist #0: ActivityRecord{32dc763 u0 com.test.demo/.TestActivity t16979}
Task id #16978
* Hist #0: ActivityRecord{45f06ce u0 com.test.demo/.MainActivity t16978}
5.intent-filter
<activity android:name=".ui.ConversationList"
android:label="@string/app_label"
android:configChanges="orientation|screenSize|keyboardHidden"
android:theme="@style/MmsHoloTheme"
android:uiOptions="splitActionBarWhenNarrow"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> //1.action
<category android:name="android.intent.category.DEFAULT" /> //2.category
<data android:mimeType="vnd.android-dir/mms-sms" /> //3.data
</intent-filter>
</activity>
(1) action
必须参数
(2) category
如果acitivty需要通过隐式调用调起的话,一定需要设置<category android:name="android.intent.category.DEFAULT" />
Note: In order to receive implicit intents, you must include the CATEGORY_DEFAULT category in the intent filter. The methods startActivity() and startActivityForResult() treat all intents as if they declared the CATEGORY_DEFAULT category. If you do not declare it in your intent filter, no implicit intents will resolve to your activity.
(3) data
非必须参数
网友评论