安卓系統監聽應用開啓和關閉的實現

最近因爲一個項目需要監聽軟件開啓和關閉,以爲安卓系統會有相關的BroadcastReciver,結果查了下資料,沒有相關的廣播,後來在論壇上看見別人用Service監聽棧頂的activity實現應用開啓和關閉的監聽。我就直接上我的代碼了。裏面寫有註釋,如果有不懂的,可以加我QQ羣與我交流:197737933.

import java.util.Timer;
import java.util.TimerTask;
import android.app.ActivityManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;

public class AppListener extends Service{
    private boolean isAppStart = false;// 判斷軟件是否打開,過濾重複執行
    private String packageName_now = "";//記錄當前所在應用的包名
    @Override
    public IBinder onBind(Intent intent) {
        // TODO 自動生成的方法存根
        return null;
    }

    @Override
    public void onCreate() {        
         timer.schedule(task, 0, 500); //開始監聽應用,每500毫秒查詢一次,用這種方式循環比while更節約資源,而且更好用,這個項目剛開始用了while,把我坑壞了
        super.onCreate();
    }
     Handler handler_listen = new Handler() {  
            public void handleMessage(Message msg) {  
                if (msg.what == 1) {  
                    ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
                    ComponentName cn = am.getRunningTasks(1).get(0).topActivity;//獲取到棧頂最頂層的activity所對應的應用
                    String packageName = cn.getPackageName();//從ComponentName對象中獲取到最頂層的應用包名
                    if (!packageName_now.equals(packageName)) {//如果兩個包名不相同,那麼代表切換了應用
                        packageName_now=packageName;//更新當前的應用包名
                        isAppStart=false;//將是否是監聽的應用包名的狀態修改爲false
                    }
                    if (packageName.equals("com.tencent.mobileqq")) {//這裏舉例監聽QQ
                        if (!isAppStart) {
                            isAppStart=true;//因爲一直在循環,所以需要加個isAppStart判斷防止代碼重複執行
                            //。。。。邏輯處理
                        }
                    }
                }  
                super.handleMessage(msg);  
            };  
        };  
        Timer timer = new Timer();  
        TimerTask task = new TimerTask() {  

            @Override  
            public void run() {  
                Message message = new Message();  
                message.what = 1;  
                handler_listen.sendMessage(message);  
            }  
        };  

    public void onDestroy() {
        timer.cancel();//銷燬服務的時候同時關閉定時器timer
        super.onDestroy();
    }

}

最後記得加上權限

   <uses-permission android:name="android.permission.GET_TASKS" />
發佈了41 篇原創文章 · 獲贊 115 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章