Activity启动模式,任务栈,回退栈,Intent再续
一、感性认识:
1、了解Activity的声明周期以及在底层管理的设计模型。
二、理性认知:
1、Task和BackTask
a、TaskStack任务栈
b、BackTask为回退栈
2、Activity的启动模式
a、standard
Activity的默认启动模式,可以实现不停的向任务栈中叠加新的Activity实例
b、singleTop
b.1、如果该Activity(singleTop)已经存在于Task栈中,并且置于栈顶,那 么再次启动该Activity时,将不再实例化该Activity,而是直接持有该Activity的引用 。
c、singleTask
c.1、如果当前Task栈中已经存在某个以singleTask启动好的Activity,那么
当该Activity再次被启动,则直接将该Activity置入当前Task栈顶,并移除
该Activity之上的所有Activity。
(PS:该模式再次启动已经存在于Task中的Activity不会导致重新实例化该 Activity)
(再次启动该Activity时,回调onNewIntent该方法。)
d、singleInstance
d.1、该Activity独占一个Task Stack,在该Activity中启动另外一个 Activity并不会在当前栈中创建实例或引用。如果重复开启该Activity (singleInstance),会检查当前BackStack中有没有该Activity的实例,如果
有,则将该Activity所在TaskStack压入BackStack栈顶。
3、startActivityForResult
a、不同任务栈中的Activity进行startActivityForResult方法调用,则会直接按照
RESULT_CANCELED处理,不会等待开启的Activity完成之后才回调。
4、Intent的属性
a、ComponentName
Intent的ComponentName这个属性指定Intent目标组件的类名称,通常Android
会根据Intent中包含的其他属性信息来启动指定的组件,如果设置了ComponentName这 个属性,则会直接忽略其他属性。
b、action
是指与组件绑定的动作。
c、category
是指action之外的一些绑定的信息。类似于:过滤条件。
(PS:必须满足Java代码中封装的Intent中的Category是xml中声明的 category标签的子集)
d、flag
类似于启动模式。具体其他的FLAG功能,查阅相关API
e、data
后续案例补充
f、type
后续案例补充
g、extra
用于存放数据
从一个Activity(界面)跳转到另一个Activity时,需要使用到Intent来启动Activity。
Intent在android中的定义为:public Intent (Context packageContext , Class<?> cls);
在Intent使用时,分为显式调用和隐式调用:
- 显式调用---直接调用Activity的Class类
例,Activity1调用Activity2
Intent intent = new Intent(this , Activity2.class);
startActivity(intent);
- 隐式调用---通过调用另一个Activity的action 来启动另一个Activity
Activity1隐式调用Activity2时需要在AndroidManifest.xml文件中配置Activity2的action和category,具体添加下面的代码到Activity2的定义中
<intent-filter>
<action android:name="myaction2"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="mycategory" />
</intent-filter>
接着同样用intent来启动Activity,代码如下:
Intent intent = new Intent("myaction2");
startActivity(intent);
这样就可以启动Activity2
注:intent 隐式调用Activity时会遇到多个Activity的intent-filter中的action和category相同时,android会先弹一 个选择界面的窗口,显式要启动的Activity列表,根据用户选择来启动Activity,如Activity2和Activity3的action和 category相同
<Activity android:name=".Activity2">
<intent-filter>
<action android:name="myaction2"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="myCategory" />
</intent-filter>
</Activity>
<Activity android:name=".Activity3">
<intent-filter>
<action android:name="myaction2"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="myCategory" />
</intent-filter>
</Activity>
启动Activity代码如下:
Intent intent = new("action2");
intent.addCategory("myCategory");
startActivity(intent);
这时就会弹出Acvity的选择窗口,选择启动activity2还是activity3