了解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);

 

posted @ 2017-02-09 16:49  lcOPM  阅读(200)  评论(0)    收藏  举报