了解Activity
Android中的activity全都归属于task管理 。task 是多个 activity 的集合,这些 activity 按照启动顺序排队存入一个栈(即“back stack”)。android默认会为每个App维持一个task来存放该app的所有activity,task的默认name为该app的packagename.
activity的生命周期:

activity被回收的状态和信息保存和恢复过程:
1 public class MainActivity extends Activity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 if(savedInstanceState!=null){ //判断是否有以前的保存状态信息 6 savedInstanceState.get("Key"); 7 } 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 } 11 @Override 12 protected void onSaveInstanceState(Bundle outState) { 13 // TODO Auto-generated method stub 14 //可能被回收内存前保存状态和信息, 15 Bundle data = new Bundle(); 16 data.putString("key", "last words before be kill"); 17 outState.putAll(data); 18 super.onSaveInstanceState(outState); 19 } 20 @Override 21 protected void onRestoreInstanceState(Bundle savedInstanceState) { 22 // TODO Auto-generated method stub 23 if(savedInstanceState!=null){ //判断是否有以前的保存状态信息 24 savedInstanceState.get("Key"); 25 } 26 super.onRestoreInstanceState(savedInstanceState); 27 } 28 }
启动模式:
"standard" (默认模式)
- "standard" (默认模式)
当通过这种模式来启动Activity时, Android总会为目标 Activity创建一个新的实例,并将该Activity添加到当前Task栈中。这种方式不会启动新的Task,只是将新的 Activity添加到原有的Task中。
-
"singleTop"
该模式和standard模式基本一致,但有一点不同:当将要被启动的Activity已经位于Task栈顶时,系统不会重新创建目标Activity实例,而是直接复用Task栈顶的Activity。
-
"singleTask"
Activity在同一个Task内只有一个实例。 如果将要启动的Activity不存在,那么系统将会创建该实例,并将其加入Task栈顶;
如果将要启动的Activity已存在,且存在栈顶,直接复用Task栈顶的Activity。
如果Activity存在但是没有位于栈顶,那么此时系统会把位于该Activity上面的所有其他Activity全部移出Task,从而使得该目标Activity位于栈顶。
- "singleInstance"
无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例且会用一个全新的Task栈来装载该Activity实例(全局单例).
如果将要启动的Activity不存在,那么系统将会先创建一个全新的Task,再创建目标Activity实例并将该Activity实例放入此全新的Task中。
如果将要启动的Activity已存在,那么无论它位于哪个应用程序,哪个Task中;系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。
两种定义启动模式方法:
使用 manifest 文件
在 manifest 文件中activity声明时,利用 activity 元素的 launchMode 属性来设定 activity 与 task 的关系。
<activity
......
android:launchMode="standard"
>
.......
</activity>
注意: 你用 launchMode 属性为 activity 设置的模式可以被启动 activity 的 intent 标志所覆盖。
使用 Intent 标志
在要启动 activity 时,你可以在传给 startActivity() 的 intent 中包含相应标志,以修改 activity 与 task 的默认关系。
Intent i = new Intent(this,NewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
intent-filter 的三大属性:
Action
一个 Intent Filter 可以包含多个 Action,Action 列表用于标示 Activity 所能接受的“动作”,它是一个用户自定义的字符串。
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<action android:name="com.scu.amazing7Action" />
……
</intent-filter>
在代码中使用以下语句便可以启动该Intent 对象:
Intent i=new Intent();
i.setAction("com.scu.amazing7Action");
Action 列表中包含了“com.scu.amazing7Action”的 Activity 都将会匹配成功
URL
在 intent-filter 节点中,通过 data节点匹配外部数据,也就是通过 URI 携带外部数据给目标组件。
<data android:mimeType="mimeType"
android:scheme="scheme"
android:host="host"
android:port="port"
android:path="path"/>
注意:只有data的所有的属性都匹配成功时 URI 数据匹配才会成功
Category
为组件定义一个 类别列表,当 Intent 中包含这个类别列表的所有项目时才会匹配成功。
<intent-filter . . . >
<action android:name="code android.intent.action.MAIN" />
<category android:name="code android.intent.category.LAUNCHER" />
</intent-filter>
// 设置全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 去除标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);

浙公网安备 33010602011771号