android(35)(service服務、生命週期、程序優先順序)
阿新 • • 發佈:2019-01-28
**1.**public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(){
public void run() {
while(true){
System.out.println("獲取最新股票資訊。。。" );
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}
}
**2.**public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
//oncreate ondestory onstart onstop onresume onpause
//服務沒有介面
@Override
public void onCreate() {
System.out.println("服務建立了");
super.onCreate();
}
@Override
public int onStartCommand (Intent intent, int flags, int startId) {
System.out.println("服務接收到了開啟指令");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
System.out.println("服務銷燬了");
super.onDestroy();
}
}
**3.android系統下的廣播:**
android系統下的廣播:
電池電量低。
電池充電完畢
簡訊到來了
程式安裝解除安裝
sd卡解除安裝 安裝
(1).寫一個類繼承廣播接受者
(2).在清單檔案配置關心的動作
(3).一旦廣播事件發生了,就會執行廣播接受者的onreceive方法
**4.任務棧和啟動模式:**
1.一個應用程式一般都是由多個activity組成的。
2.任務棧(task stack)(別名back stack後退棧) 記錄存放使用者開啟的activity的。
3.一個應用程式一被開啟系統就給他分配一個任務棧,當所有的activity都退出的時候,任務棧就清空了。
4.任務棧的id是一個integer的資料型別 自增長的。
5.在android作業系統裡面會存在多個任務棧,一個應用程式一個任務棧。
6.桌面應用和一般的應用程式是一樣的,任務棧的行為也是一樣。
7.預設情況下, 關閉掉一個應用程式,清空了這個應用程式的任務棧。應用程式的程序還會保留。
為什麼要引入任務棧的概念:
windows下 可以通過點選工作列 切換任務
android下 長按小房子 切換任務
為了記錄使用者開啟了那些activity,記錄這些activity開啟的先後順序,google引入任務棧(task stack)概念,幫助維護好的使用者體驗。
activity的啟動模式:
1. standard 預設標準的啟動模式, 每次startActivity都是建立一個新的activity的例項。
適用於絕大大數情況
2. singleTop 單一頂部,如果要開啟的activity在任務棧的頂部已經存在,就不會建立新的例項,
而是呼叫 onNewIntent() 方法。
應用場景: 瀏覽器書籤。 避免棧頂的activity被重複的建立,解決使用者體驗問題。
3. singletask 單一任務棧 , activity只會在任務棧裡面存在一個例項。如果要啟用的activity,在
任務棧裡面已經存在,就不會建立新的activity,而是複用這個已經存在的activity,
呼叫 onNewIntent() 方法,並且清空當前activity任務棧上面所有的activity
應用場景:瀏覽器activity, 整個任務棧只有一個例項,節約記憶體和cpu的目的
注意: activity還是執行在當前應用程式的任務棧裡面的。不會建立新的任務棧。
4. singleInstance 單態 單例模式
單一例項,整個手機作業系統裡面只有一個例項存在。不同的應用去開啟這個activity
共享 公用的同一個activity。
他會執行在自己單獨,獨立的任務棧裡面,並且任務棧裡面只有他一個例項存在。
應用場景:呼叫來電介面 InCallScreen
**5.生命週期:**
完整生命週期 oncreate--》onstart--》onresume--》onpause--》onstop--》ondestory
可視生命週期 onstart--》onresume--》onpause--》onstop
前臺生命週期 onresume--》onpause 介面使用者仍然可見,但是失去焦點
使用場景:
1.應用程式退出自動儲存資料 ondestory oncreate
2.應用程式最小化 暫停的操作 onstop onstart 視訊播放器
3.遊戲的暫停和開始 前臺生命週期
**6.服務以及優先順序:**
服務: 長期後臺執行的沒有介面的元件
android應用:什麼地方需要用到服務?
天氣預報:後臺的連線伺服器的邏輯,每隔一段時間 獲取最新的天氣資訊
股票顯示:後臺的連線伺服器的邏輯,每隔一段時間 獲取最新的股票資訊
mp3播放器: 後臺長期的播放音樂。
new Thread(){}.start(); 子執行緒沒有介面,也是長期後臺執行的。
android系統程序管理是按照一定的規則的:
1.應用程式一旦被開啟 通常情況下關閉(清空任務棧)後進程不會停止。方面下一次快速啟動。
帶來記憶體不足的問題。
2.Android系統有一套 記憶體清理機制。 按照優先順序去回收系統的記憶體。
程序分為5個等級的優先順序:(從高到低)
1.Foreground process 前臺程序 使用者正在玩的應用程式對應的程序
2.Visible process 可視程序 使用者仍然可以看到這個程序的介面。
3.Service process服務程序 應用程式有一個服務元件在後臺執行。
4.Background process 後臺程序 應用程式沒有服務在執行 並且最小化 (activity onstop)
5.Empty process 空程序 沒有任何執行的activity, 任務棧空了
長期後臺執行的元件, 不要在activity開啟子執行緒。
應該是建立服務,在服務裡面開啟子執行緒。
服務的目的:
1.長期後臺執行。
2.提高程序的優先順序,系統不容易回收掉程序,即便回收了,記憶體充足的時候,把程序重新建立。