1.1Activity的生命周期全面分析
1.新Activity是透明主题时,旧Activity不会走onStop;
2.Activity切换时,旧Activity的onPause会先执行,然后才会启动新的Activity;
3.Activity在异常情况下被回收时,onSaveInstanceState方法会被回调,回调时机是在onStop之前,当Activity被重新创建的时 候,onRestoreInstanceState方法会被回调,时序在onStart之后;
1.2Acitivity的启动模式(launch Mode)
1.standard 标准 (系统默认,每次启动都会重新创建实例,谁启动了这个activity,这个activity就在谁的栈里)
2.single Top 单顶 (如果activity在栈顶,那么此activity不允许被重新创建,而是会回调onNewIntent方法)
3.single Task 单任务 (如果当前启动的activity在一个栈中存在,那么不会被重复创建,onNewIntent会被回调,onNewIntent的作用就是把当前activity放到栈顶中;如果不存在,系统会先寻找是否存在需要的栈,如果找不到,重新创建一个栈;找到了就把acitivity创建到该栈中(当然是在栈顶))
4.single Instance单实例(activity单独占用一个任务栈)
其中:
singleTask有3种情况:
1.当前栈s1为abc,这时启动d,会直接创建s2,放入d
2.假设D所需要的栈为S1,s1中为abc,那么直接把D放入s1中
3.假设D所需要的栈为S1,当前s1位adbc,那么d会放入s1中,调用onNewIntent,由于singleTask有clearTop(清理头部)效果,于是s1中为ad,bc被清理了。
singletask中什么才是所需要的栈呢?
默认情况下acitivity所需要的的栈的名字是应用的包名
也可以通过TaskAffinity指定
其中注意:
TaskAffinity和allowTaskReparenting结合的时候,如果allowTaskReparenting=true的时候,
应用A启动了应用B的bActivity,首先是A启动的bActivity所以b bActivity是应该在A的任务栈中,这个时候allowTaskReparenting=true,这个时候点击home键后台运行,打开B应用,bActivity就被转移到了B任务栈中
1.3activity隐式启动activity
1.在跳转的activity中申明(如Aactiivty--RecylerActivity)
<activity
android:name=".RecyclerActivity"
android:label="@string/title_activity_recycler" >
<!-- 隐式调用RecyclerViewActivity -->
<intent-filter>
<action android:name="com.firstline.recyclerActivity.action1"/>
<action android:name="com.firstline.recyclerActivity.action2"/>
<!-- default category 必须指定 可以有多个action,categoty,data,-->
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.firstline.recyclerActivity.category1"/>
<category android:name="com.firstline.recyclerActivity.category2"/>
<data android:mimeType="text/plain" android:scheme="file" android:host="abc"/>
<data android:mimeType="image/*" android:scheme="http" android:host="www.baidu.com"/>
<data android:mimeType="video/*"/>
</intent-filter>
</activity>
2.
Intent intent = new Intent("com.firstline.recyclerActivity.action1");
//可写可不写,但是被跳转的activity中的intent-filter必须要有 <category android:name="android.intent.category.DEFAULT"/>
intent.addCategory("com.firstline.recyclerActivity.category2");
//type必须与后面相同,scheme没有指定的情况下,默认为file:开头
intent.setDataAndType(Uri.parse("file://abc"), "text/plain");
//type必须与后面相同,scheme没有指定的情况下,默认为file:开头
//intent.setDataAndType(Uri.parse("http://www.baidu.com"), "image/*");
startActivity(intent);
拓展:
MIME TYPE描述
多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。
内容类型(Content-Type),这个头部领域用于指定消息的类型。一般以下面的形式出现。[type]/[subtype]
type有下面的形式。
- Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
- Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
- Application:用于传输应用程序数据或者二进制数据;
- Message:用于包装一个E-mail消息;
- Image:用于传输静态图片数据;
- Audio:用于传输音频或者音声数据;
- Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
subtype用于指定type的详细形式。content-type/subtype配对的集合和与此相关的参数,将随着时间而增长。为了确保这些值在一个有序而且公开的状态下开发,MIME使用Internet Assigned Numbers Authority (IANA)作为中心的注册机制来管理这些值。常用的subtype值如下所示:
- text/plain(纯文本)
- text/html(HTML文档)
- application/xhtml+xml(XHTML文档)
- image/gif(GIF图像)
- image/jpeg(JPEG图像)【PHP中为:image/pjpeg】
- image/png(PNG图像)【PHP中为:image/x-png】
- video/mpeg(MPEG动画)
- application/octet-stream(任意的二进制数据)
- application/pdf(PDF文档)
- application/msword(Microsoft Word文件)
- message/rfc822(RFC 822形式)
- multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
- application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
- multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)
---------------------------------------------------------------------------------------------------------------------------
Android中MimeType的用途
Intent-Filter中的<data>有一个mimeType . 它的作用是告诉Android系统本Activity可以处理的文件的类型。如设置为 “text/plain”表示可以处理“.txt”文件。
MimeTypeMap类
MimeTypeMap类是专门处理mimeType的类。
来源: <http://blog.csdn.net/chenqian_lj/article/details/24179461>