四大组件之Activity(下)——Activity的常用Manifest属性、启动模式、ADB调试

第5节 Activity的Manifest配置

5.1 Activity的声明

Activity作为四大组件,代码中每定义一个Activity就需要在AndroidManifest.xml文件中声明它。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.anddle.activitytest">

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">

        <!--第一个Activity-->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--第二个Activity-->
        <activity android:name=".AlertActivity"
            android:theme="@android:style/Theme.Dialog">
        </activity>
    </application>

</manifest>

5.2 Activity标签常用属性

Activity标签还有一些我们常用到的属性。

  1. 这里的intent-filter标签内指定的内容表示:这个Activity可以作为这个应用程序的入口。

    <activity android:name=".MainActivity">
        <!--指定应用入口-->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    直观一点,就是说它可以被放在桌面上,供用户通过点击直接进入。假如一个应用有三个这样的Activity,那么桌面上将有三个图标,供用户点击启动。

  2. 指定Activity的主题。安卓系统为界面元素设计了几种不同的显示风格,叫做主题。关于主题的详细介绍我们将放在以后的章节。
    <activity android:name=".AlertActivity"
        <!--指定Activity的主题-->
        android:theme="@android:style/Theme.Dialog">
    </activity>
  3. 指定Activity的启动方式。启动方式在下一小节详细讲述。
    <activity android:name=".AlertActivity"
        <!--指定Activity的启动模式-->
        android:launchMode="standard">
    </activity>
  4. 指定Activity是否关注系统配置的变化,
    <activity android:name=".AlertActivity"
        <!--指定Activity关注的系统变化类型,这里只表示关注屏幕大小是否变化-screenSize、设备方向是否变化-orientation-->
        android:configChanges="screenSize|orientation">
    </activity>
  5. 响应特定的Action,遇到这样的Action就可以启动该Activity,
    <activity android:name=".VideoPlayer">
       <intent-filter>
           <action android:name="android.intent.action.VIEW" />
       </intent-filter>
    </activity>

    那么,启动该Activity的代码,就可以通过它配置中的Action

    Intent i = new Intent("android.intent.action.VIEW");
    startActivity(i);

除了以上列出的一些属性外,Activity的很多特性都可以这样设置。

第6节 Activity启动模式

Activity的启动模式,就是指当用户或者系统启动一个Activity时,将这个Activity如何放到Task中进行管理。

<activity android:name=".AlertActivity"
   <!--指定Activity的启动模式-->
   android:launchMode="standard">
</activity>

Activity有四种启动方式:standard、singleTop、singleTask、singleInstance。

6.1 standard模式

这是每个Activity默认的启动模式,如果我们没有在manifest中指定,那么Activity启动就会采用这个模式。这个模式很简单,原则只有一个:当启动这种类型的Activity时,只要重新创建,然后放在Task栈的栈顶就好了。

进一步举个例子:Activity A上,有一个按钮,点击后,可以再启动一个Activity A。这时我们看到的Task堆栈情况就是,Activity A上又创建了一个Activity A。这两个Activity都是Activity A的实例,是互相独立的Activity,在内存中有各自的一块区域。

6.2 singleTop模式

这个启动模式的原则是:当启动这个类型的Activity时,如果这个Activity有实例在当前Task中存在,并且位于这个Task的栈顶,那么就调用onNewIntent()通知一下,而不用重新创建;

否则,即使这个Task中有这个Activity实例,只要它不在栈顶,就重新创建;

使用场景:一个新闻客户端会接收新闻推送,在statusbar上显示已经收到10条推送了。当我们点击第一条的时候,启动一个显示新闻内容的Activity-ContentActivity,当我们点击statusbar上的第二条新闻时,再次启动ContentActivity。如果ContentActivity是standard模式,可以想见,在之前的新闻内容上,又回弹出一个Activity,10条推送点击十次,就会有10个Activity叠在一起。

麻烦的是返回时得按10次,而且会占用很多系统资源。

如果将ContentActivity指定为singleTop,那么点击后面9条推送时,ContentActivity只会通过onNewIntent()知道有新的调用请求,不必重新创建9个Activity实例过份消耗资源。

6.3 singleTask模式

这个启动模式的原则是:当启动这个类型的Activity时,先查看这个Activity是否有实例在系统当前的Task中存在。

6.3.1 前台Task中存在

如果它在位于前台的task中存在,并且位于这个Task的栈顶,那么就调用onNewIntent()通知一下,而不用重新创建--这一点与singleTop模式类似;

如果存在,但是不在Task的栈顶,就将这个Activity上面别的Activity全部弹出、销毁,把这个Activity的实例放到最上面,再用onNewIntent()通知它一次。

6.3.2 后台Task中存在

如果它在位于后台的task中存在,就把后台task放到前台来,然后把它上面存在的别的Activity弹出、销毁。

使用场景:应用的主Activity A,可以启动Activity B, Activity B又能启动Activity C,C又能启动D,设计者希望从D能够直接返回到主Activity。

对于这种希望在任意层级的Activity下,快速返回到主界面的应用,就可以把主Activity A设置成singleTask模式。

6.4 singleInstance模式

这个启动模式的原则是:当启动这个类型的Activity时,如果该Activity之前并不存在,就会重新创建一个Task,并把该Activity放入其中。假如这个Activity要启动别的Activity-C,那么就放在之前那个Task之上。

如果该Activity已经存在,就把该Activity所在的task切换到前台来。

总之,一个task中有且只有一个这种类型的Activity。

使用场景:对于那种需要提供给第三方调用的Activity,例如微信的分享、转发,就可以把这种Activity设置成singgleInstance。这样在系统范围内保证只有一个这样的Activity存在。

第7节 ADB工具调试Activity

为了帮助我们深入学习Activity,这里介绍通过ADB工具获取系统中现有Activity信息的方法。

7.1 打印系统Activity信息

用命令行工具进入adb所在的目录,

输入adb shell dumpsys activity activities,会输出类似如下的内容:

$ ./adb shell dumpsys activity activities

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
  Stack #0:
    Task id #178
    * TaskRecord{cce8184 #178 I=com.android.launcher3/.Launcher U=0 sz=1}
      userId=0 effectiveUid=u0a8 mCallingUid=0 mCallingPackage=null
      intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher3/.Launcher}
      realActivity=com.android.launcher3/.Launcher
      autoRemoveRecents=false isPersistable=true numFullscreen=1 taskType=1 mTaskToReturnTo=0
      rootWasReset=false mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLE
      Activities=[ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}]
      askedCompatMode=false inRecents=true isAvailable=true
      lastThumbnail=null lastThumbnailFile=/data/system/recent_images/178_task_thumbnail.png
      stackId=0
      hasBeenVisible=true mResizeable=false firstActiveTime=1451983947131 lastActiveTime=1451983947131 (inactive for 2501s)
      * Hist #0: ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}
          packageName=com.android.launcher3 processName=com.android.launcher3
          launchedFromUid=0 launchedFromPackage=null userId=0
          app=ProcessRecord{f7b8d6d 25040:com.android.launcher3/u0a8}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher3/.Launcher }
          frontOfTask=true task=TaskRecord{cce8184 #178 I=com.android.launcher3/.Launcher U=0 sz=1}
          taskAffinity=null
          realActivity=com.android.launcher3/.Launcher
          baseDir=/system/priv-app/Launcher3/Launcher3.apk
          dataDir=/data/user/0/com.android.launcher3
          stateNotNeeded=true componentSpecified=false mActivityType=1
          compat={420dpi} labelRes=0x7f0c0005 icon=0x7f030000 theme=0x7f0e000e
          config={1.0 310mcc260mnc zh_CN ldltr sw411dp w411dp h659dp 420dpi nrml port finger qwerty/v/v dpad/v s.6}
          stackConfigOverride={1.0 ?mcc?mnc ?locale ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?orien ?uimode ?night ?touch ?keyb/?/? ?nav/?}
          taskDescription: iconFilename=null label="null" color=ff212121
          launchFailed=false launchCount=1 lastLaunchTime=-41m41s66ms
          haveState=false icicle=null
          state=RESUMED stopped=false delayedResume=false finishing=false
          keysPaused=false inHistory=true visible=true sleeping=false idle=true
          fullscreen=true noDisplay=false immersive=false launchMode=2
          frozenBeforeDestroy=false forceNewConfig=false
          mActivityType=HOME_ACTIVITY_TYPE
          waitingVisible=false nowVisible=true lastVisibleTime=-41m39s31ms

    Running activities (most recent first):
      TaskRecord{cce8184 #178 I=com.android.launcher3/.Launcher U=0 sz=1}
        Run #0: ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}

    mResumedActivity: ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}

  mFocusedActivity: ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}
  mFocusedStack=ActivityStack{c009da2 stackId=0, 1 tasks} mLastFocusedStack=ActivityStack{c009da2 stackId=0, 1 tasks}
  mSleepTimeout=false
  mCurTaskId=178
  mUserStackInFront={}
  mActivityContainers={0=ActivtyContainer{0}A}
  mLockTaskModeState=NONE mLockTaskPackages (userId:packages)=
    0:[]
 mLockTaskModeTasks[]

它记录下了当前安卓系统中所有的Task,以及每个Task中包含的Activity信息。

例如这里记录了,

  1. 系统中有一个Task id#178Task;
  2. Task栈中的Activity,从上到下依次是TaskRecord---com.android.launcher3/.Launcher,一个Activity
  3. 并且com.android.launcher3/.Launcher这个Activity是位于前台的Activity

这些信息对程序的调试会有很大的帮助。

7.2 ADB启动Activity

用ADB工具启动已知Activity,

$ ./adb shell am start -n 包名/包名.activity名称}

这里的包名就形如:com.android.launcher3,例如

$ ./adb shell am start -n com.android.launcher3/com.android.launcher3.Launcher}
时间: 2024-10-29 19:11:47

四大组件之Activity(下)——Activity的常用Manifest属性、启动模式、ADB调试的相关文章

android四大组件(一)Activity

一.创建一个新的Activity 1.android的四大组件都要在清单文件里面配置 2.如果想让你的应用有多个启动图标,你的activity需要这样配置 <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </inte

Android 四大组件(1)--Activity

四大组件分类 Activity (本文所述) Service   //服务 Content Provider   //内容提供者 BroadcastReceiver   //广播接收器 概括---------------------------------------------------------------------- 在Android 应用程序中,每个Activity通常对应一个可视化界面,其中可以显示Android的各种UI控件,用户可以用来交互为了完成某项任务.Activity中

Activity启动模式 及 Intent Flags 与 栈 的关联分析

   在学习Android的过程中,Intent是我们最常用Android用于进程内或进程间通信的机制,其底层的通信是以Binder机制实现的,在物理层则是通过共享内存的方式实现的.     Intent主要用于2种情景下:(1)发起意图  (2)广播     它的属性有:ComponentName,action,data,category,extras,flags等,通常情况下,进行Intent的匹配涉及到3个属性:Action,Data,Category.这些东西都需要了解才能对它有个深入的

Android 四大组件之Service(上)

1.Service简介 Service是Android四大组件中最与Activity相似的组件,他们都代表可执行的程序.Service一直运行于后台,不会与用户交互,可用来处理一些耗时的任务(比如:后台播放音乐,I/O操作等).它的创建.配置与Activity基本相似,下面将详细介绍Android Service的开发. 2.创建.配置Service 2.1 定义一个继承Service类的子类 2.2 在AndroidManifest.xml中配置该Service 需要注意的是 Service和

【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析

http://blog.csdn.net/vipzjyno1/article/details/25463457    在学习Android的过程中,Intent是我们最常用Android用于进程内或进程间通信的机制,其底层的通信是以Binder机制实现的,在物理层则是通过共享内存的方式实现的.     Intent主要用于2种情景下:(1)发起意图  (2)广播     它的属性有:ComponentName,action,data,category,extras,flags等,通常情况下,进行

Android 基础-给有java基础的初学者(四大组件)

以前一直是在各大网站,论坛上面看各种技术点和知识点,都是需要用什么技术点,就去找相关的帖子,从来没有自己动手写过: 从今天开始,我为自己定下一个目标,将andorid中用到的技术点和知识点都一条条的写下来,方便自己以后在工作中遇到类似问题,能快速的找到解决方案------此贴均会有很多知识内容为摘录整理,和博主自己的一些理解和看法,仅供参考,有错误的地方欢迎大神指点. 直入主题,说到android就不得说android的四大组件 andorid中的四大组件 1.Activity (不解释) 2.

【Android基础】Activity启动模式以及Intent Flags 与 栈 的全面解析

Android开发的过程中,Intent是我们最常用Android用于进程内或进程间通信的机制. Intent主要用于2种情景下:发起意图 .广播 其底层实现原理不在此篇文章的讨论范围,以后会陆续更新上的. 下面我就根据近期学习,总结记录下Activity启动模式 及 Intent Flags 与 栈 的关联分析. 1.首先我们先搞清楚什么是栈: 栈是一种常用的数据结构,栈只允许访问栈顶的元素,栈就像一个杯子,每次都只能取杯子顶上的东西,而对于栈就只能每次访问它的栈顶元素,从而可以达到保护栈顶元

(六十一)Activity启动模式 及 Intent Flags 与 栈 的关联分析(转载自:http://blog.csdn.net/vipzjyno1/article/details/25463457)

   在学习Android的过程中,Intent是我们最常用Android用于进程内或进程间通信的机制,其底层的通信是以Binder机制实现的,在物理层则是通过共享内存的方式实现的.     Intent主要用于2种情景下:(1)发起意图  (2)广播     它的属性有:ComponentName,action,data,category,extras,flags等,通常情况下,进行Intent的匹配涉及到3个属性:Action,Data,Category.这些东西都需要了解才能对它有个深入的

Android群英传知识点回顾——第八章:Activity与Activity调用栈分析

8.1 Activity 8.1.1 起源 8.1.2 Activity形态 8.1.3 生命周期 8.2 Activity任务栈简介 8.3 ActivityManifest启动模式 8.3.1 standard 8.3.2 singleTop 8.3.3 singleTask 8.3.4 singleInstance 8.4 Intent Flag启动模式 8.5 清空任务栈 8.6 Activity任务栈使用 四大组件中出现频率最高的组件 Activity是与用户交互的第一接口,它提供了一