1. 程式人生 > >安卓學習(初)第二章(4)(《第一行程式碼》)

安卓學習(初)第二章(4)(《第一行程式碼》)

一、活動的啟動模式

1、啟動模式有四種,分別是standard,singleTop,singleTask,singleInstance。可以在註冊活動中通<acivity>標籤指定android:launchMode="... 模式  ..."屬性來選擇啟動模式。

2、standard是活動預設的啟動模式(沒有顯示指定時就執行這個模式)。該模式下每啟動一個新活動,它就會在返回棧中並處於棧頂位置(無論返回棧中是否已經存在這個活動),每次啟動都會建立該活動的一個新例項。

3、singleTop模式下,如果發現返回棧的棧頂已經是該項活動,則不會重新建立例項而是直接使用棧頂的活動。但如果棧頂以外存在相同的活動而棧頂不是該項活動,一樣會重新建立新活動到棧頂。

4、singleTask模式下每次啟動該活動時系統首先會在返回棧中檢查是否存在該活動例項,如果發現已經存在則直接使用該例項並把在這個活動之上的所有活動統統出棧,如果沒有就建立一個新例項。

5、singleInstance模式的活動會啟用一個新的返回棧來管理這個活動,無論是哪個應用程式訪問這個活動都共用這同一個棧。

二、知曉非自己編寫的專案正在執行的是哪一個活動

1、首先建立一個繼承AppCompatActivity的Java class。右擊example.activitytest包→New→Java class,設定name為BaseActivity,super class為AppCompatActivity。

2、在這個Java class裡寫的程式如下:

public class BaseActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
    }
}

使其的子類都會在日誌上打印出它的名稱

3、最後把每一個繼承AppCompatActivity的活動都替換成繼承BaseActivity,由於BaseActivity繼承AppCompatActivity,所以活動的一切執行都不會受影響,反而會在日誌裡面執行Log.d("BaseActivity",getClass().getSimpleName()),列印每一個活動的應用顯示名稱,然後就能把實際應用的各個活動和那麼多項活動程式碼對上號。

三、隨時隨地退出程式

1、當程式開啟多個活動時(即返回棧有多個活動),要完全退出程式要按多次back鍵,home鍵也只能讓程式在後臺掛起。為了方便退出程式,我們可以設定一鍵退出程式。

2、首先,新建一個ActivityCollector類作為活動管理器:

public class ActivityCollector {
    public static List<Activity> activities=new ArrayList<>();//用List暫存活動
    public static void addActivity(Activity activity){        //addActivity方法新增活動到管理器
        activities.add(activity);                             
    }

public static void removeActivity(Activity activity){        //removeActivity方法在管理器移除活動
    activities.remove(activity);
}
    public static void finishALL(){                          //finishALL方法結束所有管理器裡面的活動即關閉程式
        for (Activity activity:activities){
            if(!activity.isFinishing()){                    
                activity.finish();
            }
        }
    }
}

3、呼叫活動管理器:

public class BaseActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {            //onCreate即活動建立時活動新增到活動管理器
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }
    @Override
    protected void onDestroy(){                                     //onDestroy即活動將要被銷燬時從活動管理器移除
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
} 

BaseActivity 的父類是 AppCompatActivity,即活動的父類是BaseActivity的都會執行上面的活動管理器,因此不同程式不應用同一個BaseActivity父類,否則將一鍵同時關閉兩個程式。

4、最後,在父類為BaseActivity的活動中新增按鍵觸發程式碼,呼叫ActivityCollector.finishALL();這行程式碼,程式所有以BaseActivity為父類的活動(即在活動管理器的活動)全部被銷燬(即退出程式)。

*5、銷燬所有活動程式碼後面可以再加上殺掉當前程序的程式碼(以保證程式完全退出):

@Override
public void onClick(View v) {
    ActivityCollector.finishALL();
    android.os.Process.killProcess(android.os.Process.myPid());
}

killProcess()方法用於殺掉一個程序,它接收一個程序id引數,可以通過myPid()方法獲取當前程序的id。注意:killProcess()只能用於殺掉當前程序,無法殺掉其他程式。

*四、最佳的啟動活動方法

public class secondActivity extends AppCompatActivity {
    public static void actionStart(Context context,String data1,String data2){
        Intent intent = new Intent(context,secondActivity.class);
        intent.putExtra("param1",data1);
        intent.putExtra("param1",data2);
        context.startActivity(intent);
      }
    }

在secondActivity 程式碼裡引用了actionStart方法傳入了開啟secondActivity所需要的資料,這樣一來,在別的活動要開啟secondActivity時就只需要一行程式碼:

secondActivity .actionStart(FirstActivity.this,"data1","data2");

此外,程式設計師也能對secondActivity所需要的資料一目瞭然,不需要過度的詢問也可操縱。