判斷手機是否退到背景,這是我們在Android開發中實作一些功能時,經常會考慮的問題
比如:按HOME,BACK鍵時,程式退到背景,消息以Notification形式彈出 ,或者程式在服務中把App退到背景,彈出服務浮窗,點選後回到目前頁面等,這些也是實作及時通訊,服務推送過程經常遇到的,比如QQ,微信消息提醒,網絡電話通知展示等.
廢話不多說,直接上圖:
如果需要判斷程式進入背景,然後顯示通知,彈出通知之後,直接進入HOME鍵之前頁面,情點選下一節
程式背景切換前台,點選通知進入目前頁面
DEMO下載下傳位址為:點選下載下傳demo
判斷手機是否退到背景,本人查閱各種資料,發現實作其實很簡單,目前自己主要實作方式有兩種:
方式一:
-
public boolean isAppOnForeground() {
-
ActivityManager activityManager = (ActivityManager) getApplicationContext()
-
.getSystemService(Context.ACTIVITY_SERVICE);
-
String packageName = getApplicationContext().getPackageName();
-
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
-
.getRunningAppProcesses();
-
if (appProcesses == null)
-
return false;
-
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
-
// The name of the process that this object is associated with.
-
if (appProcess.processName.equals(packageName)
-
&& appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
-
return true;
-
}
-
}
-
return false;
-
}
這是我在網上找到的例子,
主要的實作原理就是,使用ActivityManager,首先拿到自己App的包名,再拿到Android裝置中所有正在運作的App包名,
然後對所有的App進行周遊,通過判斷正在運作的App中包名有沒有和自己的App相等,進而判斷自己的App是否退到背景.
-
@Override
-
protected void onPause() {
-
super.onPause();
-
if(!isAppOnForeground()){
-
Toast.makeText(getApplicationContext(), TAG+"onPause:",
-
Toast.LENGTH_SHORT).show();
-
}else {
-
sendBroadcast(new Intent(NotificationIntentReceiver.ACTION_ENABLE_MESSAGES)
-
.setClass(this, NotificationIntentReceiver.class));
-
Toast.makeText(getApplicationContext(), TAG+"背景運作1",
-
Toast.LENGTH_SHORT).show();
-
}
-
}
然後在onPause()方法中,進行判斷,上面代碼中實作的是,App退出背景就發送廣播,然後在廣播中執行Notification,然後在回到Activity時,在onResume()中清除應該清除Notification.
方法二:
這種方法主要是根據Application中實作ActivityLifecycleCallbacks回調,(可以百度ActivityLifecycleCallbacks)
ActivityLifecycleCallbacks是4.0以後新增的,
主要用于監聽Activity的狀态,這裡主要關注onActivityStarted(Activity activity)和onActivityStopped(Activity activity)兩個方法,
簡單的解釋:
Activity在start時會走onActivityStarted方法,
而Activity在退出背景時,則會走onActivityStopped方法,是以我們可以通過這種方法實作:
-
int countActivity = 0;
-
@Override
-
public void onActivityStarted(Activity activity) {
-
countActivity++;
-
}
-
@Override
-
public void onActivityStopped(Activity activity) {
-
countActivity--;
-
L.i("onActivityStopped", "countActivity=" + countActivity);
-
if (countActivity <= 0) {
-
if (WDRTCSysConfig.getInstance().isCalling()) {
-
Intent _intent = new Intent(WDBroadcastReceiver.ACTION_ENABLE_MESSAGES);
-
_intent.setClass(getApplicationContext(), WDBroadcastReceiver.class);
-
sendBroadcast(_intent);
-
}
-
}
-
. }
上面的代碼主要原理是:我在自定義的Application中定義一個變量,主要是模拟Stack<Activity>判斷等操作,
當我們一個Activity在 Start時countActivity就加一,
當我們一個Activity在 Stop時countActivity就減一,
而最後當我們countActivity值等于0時,就代表App沒有Activity正在Start,程式在退到背景,然後執行我們需要執行的退到背景處理.
WDRTCSysConfig.getInstance().isCalling()隻是一個布爾值得邏輯判斷,我這裡執行的是正在語音服務中.
APP退到背景是,發生廣播,執行通知的操作.
ActivityLifecycleCallbacks的實作重寫的方法如下:
-
public class DemoApplication extends Application implements Application.ActivityLifecycleCallbacks{
-
@Override
-
public void onCreate() {
-
super.onCreate();
-
//全局管理Activity生命周期
-
registerActivityLifecycleCallbacks(this);
-
}
-
@Override
-
public void onActivityCreated(Activity activity, Bundle bundle) {
-
}
-
@Override
-
public void onActivityStarted(Activity activity) {
-
}
-
@Override
-
public void onActivityResumed(Activity activity) {
-
}
-
@Override
-
public void onActivityPaused(Activity activity) {
-
}
-
@Override
-
public void onActivityStopped(Activity activity) {
-
}
-
@Override
-
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
-
}
-
@Override
-
public void onActivityDestroyed(Activity activity) {
-
}
-
}