Activity

作者: 坠叶飘香 | 来源:发表于2019-04-19 11:45 被阅读0次

    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);
    }
    

    参考:Intent 和 Intent 过滤器

    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

    非必须参数

    相关文章

      网友评论

          本文标题:Activity

          本文链接:https://www.haomeiwen.com/subject/xnxqgqtx.html