Activity作为四大组件之首,是使用最为频繁的一种组件,中文翻译为“活动”。
activity生命周期
下面用两个图来阐释activiy正常的生命周期和出现异常的生命周期;
activity启动模式
启动模式总共有四种:
- standard :标准模式,每次启动都会创建一个activity对象。
- singTop :栈顶复用模式,启动activity时,如果activity实例位于栈顶,那么就复用该activity对象。
- singTask :栈内复用模式(单实例模式),启动activity时,如果activiyu实例在栈内已经存在,那么将复用此activity。
- singInstance :单实例模式,拥有singTask所有的特性,同时具有此模式的Activity只能单独的位于一个任务栈中的特点。
设置activity启动模式的方法: - 方法一,在manifests.xml文件中进行声明:
android:launchMode="singleInstance"
- 方法二,在启动activity时设置Flag:
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
同时,值得注意的是,我们可以利用TaskAffinity来进行申明任务栈,默认属性就activity的包名,所以如果声明TaskAffinity属性值为包名,就相当于没有指定。
隐式启动activity
action 配对原则
Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。
category 匹配规则
Intent如果含有cateory,那么所有的cateory都必须和过滤规则中的每一个cateory相同。startActivity和startActivityForReslut都会为其添加一个android.intent.category.DEFAULT的默认值。而这个值默认就添加到过滤策略中,但是一旦添加了其他的catagory,就需要手动添加此值,否则不能正常启动。
data 配额规则
过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。
< data android:scheme="string"
android:host ="string"
android:port ="string"
android:path ="string"
android:pathPattern="string"
android:pathPrefix ="string"
android:mimeType="string"
/>
URL的结构如下:
<scheme>://<host>/[<path>|<pathPrefix>|<pathPattern>]
一个完整的示例如下:
<activity android:name=".view.SecondActivity">
<intent-filter>
<action android:name="reoger.hut.voice.a"/>
<action android:name="reoger.hut.voice.b"/>
<category android:name="reoger.hut.voice.c"/>
<category android:name="reoger.hut.voice.d"/>
<category android:name="reoger.hut.voice.e"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
对应的启动Intent代码如下:
PackageManager packageManager = getPackageManager();
Intent intent = new Intent();
intent.setAction("reoger.hut.voice.a");
intent.addCategory("reoger.hut.voice.c");
intent.setDataAndType(Uri.parse("file://abs"),"text/plain");
ResolveInfo resolveInfo = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
ComponentName componentName = intent.resolveActivity(packageManager);
if(componentName ==null ){
Log.d("TAG","******/*/*********************************/*/*/*/*/**/*");
}
if(resolveInfo ==null)
Toast.makeText(MainActivity.this,"没有找到对应的actvity",Toast.LENGTH_SHORT).show();
else
startActivity(intent);
---end