2012-12-13 149 views
1

我究竟想要什麼?Android活動生命週期問題

在我的應用程序中,我有4/5活動和一個後臺線程與服務器交談。我想有一些方法來獲得我應用程序的最頂級活動。但令人驚訝的是,他們是我無法得到的?

我做了什麼?

搜索一段時間後,我實現了Activity類型的變量mCurrentOnTopActivityonResume()和我設置變量中的每個活動的onPause()。 (這實際上是一個不好的方法)。

我到達了哪裏?

現在,他們都在從服務器接收的一些消息後,我想要做的UI線程一些東西,即表現出一定的對話框或刷新ListView案件,現在他們是沒有辦法檢查是否mCurrentOnTopActivity指的activiy這是實際運行或不運行(無論出於何種原因完成或失去焦點)。

我現在想要什麼? 現在我基本上要幫助以下兩個問題: -

  1. 我怎麼知道這是我的應用程序的當前運行的最上面的活動?
  2. 我怎麼知道活動是否仍在運行與否(即我想要一些東西一樣isActicitAlive() (imaginary function)其中onResume()電話和onPause()

我使用活動的變量,並設置它實現2點之間返回true在onResume()onPause(),但是,這是做到這一點的唯一途徑?

回答

2
ArrayList<String> runningactivities = new ArrayList<String>(); 

ActivityManager activityManager = (ActivityManager)getBaseContext().getSystemService (Context.ACTIVITY_SERVICE); 

List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 

for (int i1 = 0; i1 < services.size(); i1++) { 
    runningactivities.add(0,services.get(i1).topActivity.toString()); 
} 

if(runningactivities.contains("ComponentInfo{com.app/com.app.main.MyActivity}")==true){ 
    Toast.makeText(getBaseContext(),"Activity is in foreground, active",1000).show(); 
} 

有了這個,你可以檢查一下,你正在尋找活動是否在運行與否。

esle,如果你想使用onStart()onStop()方法,你可以使用下面的代碼,

class MyActivity extends Activity { 
    static boolean active = false; 

     @Override 
     public void onStart() { 
     super.onStart(); 
     active = true; 
     } 

     @Override 
     public void onStop() { 
     super.onStop(); 
     active = false; 
     } 
} 
+0

我目前正在使用你的答案的第二種方法。讓我檢查你的第一種方法的效率觀點。現在查詢ActivityManager並不會聽起來很有效率,至少對我來說......任何方式都要感謝您的答案。 – aProgrammer

+0

我結束了一些修改後實現了你的建議。謝謝! – aProgrammer

+0

@Amit: - :)哪一個。?第一或第二種方法。 –

1

你可以使用service binding,只讓最上面的活動結合的服務。

+0

我目前在我的應用程序中沒有使用服務。我需要使用它嗎? – aProgrammer

+0

對不起,我認爲與服務器交談的後臺線程是作爲服務實現的,但如果不是,我不會建議僅爲此實現服務。 – 1615903