❶ android 後台service怎麼監聽到應用退出狀態
是監聽自己的程序退出狀態
退出的時候毀掉用OnDestory()。
在這個方法里弄個標志位,servirce就不斷判斷這個標志位。
標志位改變了,說明退出了。
❷ Android 能不能監聽到第三方應用App的啟動和退出
可以,我原來做的是用一個計時器(為了准確率可以0.1s輪詢一次)去監聽手機的TopActivity,獲取TopActivity的包名(應用的包名是唯一的),當TopActivity發生變化就說明使用的應用發生了改變,就實現了監聽第三方應用的啟動和退出(其中也包括系統應用,過濾包名就可以了)。有什麼問題再問我
❸ Android應用如何監聽自己是否被卸載及卸載反
1,注冊BroadcastReceiver,監聽"android.intent.action.PACKAGE_REMOVED"系統廣播
結果:NO。未寫代碼,直接分析,卸載的第一步就是退出當前應用的主進程,而此廣播是在已經卸載完成後才發出的,此時主進程都沒有了,去哪onReceive()呢?
2,若能收到"將要卸載XX包"的系統廣播,在主進程被退出之前就搶先進行反饋處理就好了,可惜沒有這樣的系統廣播,不過經過調研,倒是發現了一個辦法,讀取系統log,當日誌中包含"android.intent.action.DELETE"和自己的包名時,意味著自己將要被卸載。
結果:NO。調試時發現此方法有兩個缺陷,(1)點擊設置中的卸載按鈕即發出此Intent,此時用戶尚未在彈框中確認卸載;(2)pm命令卸載不出發此Intent,意味著被諸如手機安全管家,豌豆莢等軟體卸載時,無法提前得知卸載意圖。
3,由於時間點不容易把控,所以乾脆不依賴系統廣播或log,考慮到卸載過程會刪除"/data/data/包名"目錄,我們可以用線程直接輪詢這個目錄是否存在,以此為依據判斷自己是否被卸載。
結果:NO。同方法1,主進程退出,相應的線程必定退出,線程還沒等到判斷目錄是否存在就已經被銷毀了。
4,改用C端進程輪詢"/data/data/包名"目錄是否存在
結果:YES。藉助java端進程fork出來的C端進程在應用被卸載後不會被銷毀。
二 方案
Android自API1就有的一個類FileObserver,這個類用於監聽某個文件的變化狀態,如果是目錄,這個類還可以監聽其子目錄及子目錄文件的變化狀態,通過閱讀FileObserver源碼,發現其實現利用了Linux內核中一個重要的機制inotify,它是一個內核用於通知用戶空間程序文件系統變化的機制,詳情可參考http://en.wikipedia.org/wiki/Inotify,裡面對inotify有比較詳細的說明。
使用inotify的好處就在於不需要每1s的輪詢,這樣就不會無謂地消耗系統資源,使用inotify時會用read()方法阻塞進程,直到收到IN_DELETE通知,此時進程重新被喚醒,執行反饋處理流程。
三方案
阻塞結束後,通過調用exec函數發出am命令調起瀏覽器訪問網頁,在API16(Android 4.1.x)的設備上尚可正常訪問網頁,而API17(Android 4.2.x)的設備上連瀏覽器也不能調起。解決方案:增加處理分支,若API>=17,將userSerialNumber傳遞給C端進程,然後在am命令中帶上參數--user userSerialNumber即可
❹ Android 能不能監聽到第三方應用App的啟動和退出
據我所知,答案是No,沒有這樣的broadcast,你沒法用receiver去監聽。唯一的辦法就是後台查詢。 你的採納是我前進的動力, 記得好評和採納,答題不易,互相幫助, 手機提問的朋友在客戶端右上角評價點(滿意)即可. 如果你認可我的回答,請及時點擊(採納為滿意回答)按鈕!!
❺ android 怎麼判斷應用是否退出
在Android中退出程序比較麻煩,尤其是在多個Activity的程序中,在2.2之前可以採用如下代碼退出程序:
Java代碼
[java]
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
此種方法是一種最方便和最簡單的退出程序的辦法,但是在2.2和2.2之後就不能用了,那麼如果我們要退出程序有4種辦法:
採用content
view棧:如果程序是多界面,但是又沒有強制要求每一個界面一個Activity,可以將每個界面設計為一個View,在界面切換時,只需要調用
Activity的setContentView方法設置Activity的Contentview,這樣退出程序只需要將這一個Activity退出
就可以了,但是需要設計一個棧來管理content view。
可以自定義一個Activity的棧,在程序退出時將棧中的所有的Activity進行finish,這種方法,我以前的文章中有詳述。
前兩種方法的精髓之處都是需要自己設計一個棧用來管理界面或者Activity,這樣程序就比較復雜一些。 第3中方法就是,先讓程序到Home界面,然後再將process殺死:代碼如下:
[java]
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
android.os.Process.killProcess(Process.myPid());
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
android.os.Process.killProcess(Process.myPid());
4.還有一種就是使用方法是使用Android的Broadcast機制。在所有的Activity中注冊退出程序的消息,當收到消息時調用finish方法。 然後再有退出程序功能的Activity上廣播關閉消息。代碼如下:
[java]
package com.kingtone.activity;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
/**
* 所有Activity的父類,用來注冊退出程序的廣播事件,
* 並且對收到的退出程序事件進行處理
* @author Administrator
*
*/
public class CommonActivity extends Activity {
//廣播的內部類,當收到關閉事件時,調用finish方法結束activity
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
};
@Override
public void onResume() {
super.onResume();
//在當前的activity中注冊廣播
IntentFilter filter = new IntentFilter();
filter.addAction(GlobalVarable.EXIT_ACTION);
this.registerReceiver(this.broadcastReceiver, filter);
}
}
package com.kingtone.activity;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
/**
* 所有Activity的父類,用來注冊退出程序的廣播事件,
* 並且對收到的退出程序事件進行處理
* @author Administrator
*
*/
public class CommonActivity extends Activity {
//廣播的內部類,當收到關閉事件時,調用finish方法結束activity
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
};
@Override
public void onResume() {
super.onResume();
//在當前的activity中注冊廣播
IntentFilter filter = new IntentFilter();
filter.addAction(GlobalVarable.EXIT_ACTION);
this.registerReceiver(this.broadcastReceiver, filter);
}
}
在需要退出程序的Activity(CommonActivity的子類)中,退出程序代碼如下:
[java]
Intent intent = new Intent();
intent.setAction(GlobalVarable.EXIT_ACTION); // 退出動作
this.sendBroadcast(intent);// 發送廣播
super.finish();
//退出後台線程,以及銷毀靜態變數
System.exit(0);
Intent intent = new Intent();
intent.setAction(GlobalVarable.EXIT_ACTION); // 退出動作
this.sendBroadcast(intent);// 發送廣播
super.finish();
//退出後台線程,以及銷毀靜態變數
System.exit(0);
監聽並處理用戶按下back鍵的方法
[java]
package com.example.android_test01;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
System.out.println("你按下了back1");
show_simple();
return super.onKeyDown(keyCode, event);
}
//先調用的onKeyDown(int keyCode, KeyEvent event)方法,然後調用的onBackPressed()方法;
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
System.out.println("按下back,立刻退出activity時調用");
super.onBackPressed();
}
public void show_simple()
{
AlertDialog.Builder builder=new Builder(this);
builder.setTitle("歡迎使用本軟體");
builder.setPositiveButton("確定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//退出應用;
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}) ;
builder.create().show();
}
}
package com.example.android_test01;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
System.out.println("你按下了back1");
show_simple();
return super.onKeyDown(keyCode, event);
}
//先調用的onKeyDown(int keyCode, KeyEvent event)方法,然後調用的onBackPressed()方法;
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
System.out.println("按下back,立刻退出activity時調用");
super.onBackPressed();
}
public void show_simple()
{
AlertDialog.Builder builder=new Builder(this);
builder.setTitle("歡迎使用本軟體");
builder.setPositiveButton("確定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//退出應用;
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}) ;
builder.create().show();
}
}
❻ android可以監聽application退出嗎
可以給application注冊一個ondestroy事件,即銷毀時觸發的事件。
在Android中,Activity有個棧,一個Activity結束掉,會回到上一個Activity,並不是退出應用程序。
Android中,退出應用程序的方式:
1.通過pid
int pid = android.os.Process.myPid(); //獲取當前應用程序的PID
android.os.Process.killProcess(pid); //殺死當前進程
這種方法退出應用,是會保留某些後進程,例如:Service,Notifications等。
2.通過ActivityManager
ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE); //獲取應用程序管理器
manager.killBackgroundProcesses(getPackageName()); //強制結束當前應用程序
這種方式退出應用,會結束本應用程序的一切活動,因為本方法會根據應用程序的包名殺死所有進程包括Activity,Service,Notifications等。
❼ android 返回鍵的監聽如何設置
你的MainActivity是第一個Activity吧?你只需要在SecondActivity設置返回監聽到MainActivity就可以了。另外你要注意當你啟動到一個新的Activity的時候,記得將當前的activity finish掉。
稍微想了一下,我知道你為何按返回鍵的時候重復在m和s之間跳轉了。因為你跳轉到M的時候沒有將s finish掉,這樣的話你反悔其實是返回到s,而你又監聽了s的返回鍵,因此又回到了m,周而復始。
❽ android 如何監聽前後台切換
這段時間有需求,需要利用aop切面技術完成數據統計的工作,其中需要統計活躍(定的規則是:用戶從後台切換到前台就算一次活躍)。所以關於如何監聽前後台切換就有以下的描寫。
一.使用ActivityLifecycleCallbacks簡單app進入後台
有時需要監聽到應用在前後台切換並做些處理,一般的做法可能是建立一個BaseActivity,然後全部的Activity都繼承它,在BaseActivity的onStart和onStop中計數去處理。這樣並不是最好的方式,不做詳細介紹,有更好的方式,道理其實差不多,就是藉助ActivityLifecycleCallbacks來實現。
1)寫了個幫助類:
2)Application中使用(注意:僅在Application中才能使用,因為Application的生命周期能監聽到每個Activity)
原文地址: https://blog.csdn.net/bzlj2912009596/article/details/80073396
❾ android 如何監聽程序從前台轉入後台
一、通過ActivityManager.RunningAppProcessInfo判斷
首先,我們需要寫一個BaseActivity,然後讓我們應用程序的Activity都繼承自BaseActivity,這樣就可以統一管理,然後在BaseActivity的onResume()和onStop()方法中進行判斷應用程序是否進入到後台並且是否從後台返回到了前台,直接看代碼:
{
publicstaticbooleanisActive;//全局變數
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
}
@Override
protectedvoidonResume(){
if(!isActive){
//app從後台喚醒,進入前台
isActive=true;
Log.i("ACTIVITY","程序從後台喚醒");
}
super.onResume();
}
@Override
protectedvoidonStart(){
super.onStart();
}
@Override
protectedvoidonPause(){
super.onPause();
}
@Override
protectedvoidonStop(){
if(!isAppOnForeground()){
//app進入後台
isActive=false;//記錄當前已經進入後台
Log.i("ACTIVITY","程序進入後台");
}
super.onStop();
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
}
/**
*APP是否處於前台喚醒狀態
*
*@return
*/
(){
=(ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
StringpackageName=getApplicationContext().getPackageName();
List<ActivityManager.RunningAppProcessInfo>appProcesses=activityManager
.getRunningAppProcesses();
if(appProcesses==null)
returnfalse;
for(ActivityManager.:appProcesses){
//.
if(appProcess.processName.equals(packageName)
&&appProcess.importance==ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
returntrue;
}
}
returnfalse;
}
}
❿ Android 能不能監聽到第三方應用App的啟動和退出
應該是可以的。還可以在應用內調用某些應用 或者 是獲取並操作其他應用的數據,不過要有相關的許可權或者ContentProvider。
監聽程序啟動見 某大神的博客:
http://blog.csdn.net/xiao_chilun/article/details/52096149