最近因爲一個項目需要監聽軟件開啓和關閉,以爲安卓系統會有相關的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" />