導航:首頁 > 操作系統 > android監聽應用退出

android監聽應用退出

發布時間:2022-06-17 08:11:57

『壹』 android 後台service怎麼監聽到應用退出狀態

監聽自己的程序退出狀態退出的時候毀掉用OnDestory()。
在這個方法里弄個標志位,servirce就不斷判斷這個標志位。
標志位改變了,說明退出了。

『貳』 Android 能不能監聽到第三方應用App的啟動和退出

在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 怎麼監聽app程序進程被殺死了

這個實現很復雜, 需要用到雙進程守護技術, 兩個進程相互守護, 任何一方被殺死, 立即喚醒對方, 具體怎麼實現自動網路

『肆』 怎樣讓android應用永遠不退出或者退出後有通知

要想永遠不被系統kill掉,那你只能是升級成系統應用。
你的這個需求其實我也做過但是也不是%100 保證 Service 永遠不被 Kill.
說一下我的思路吧
1,定義一個服務在後台運行,讓這個服務單獨一個進程,不要和你的應用程序共享一個進程。
2.在你的service的onDestroy()方法中調用 onStart() 方法。
3.定義一個介面開機廣播的接收器,開機就啟動你的服務。
4.根據的業務需求是需要定位,那肯定是需要網路的,你可以再寫一個接收網路廣播的接收器,當網路設置從斷網到聯網,就啟動你的服務,開始定位。

『伍』 android怎樣判斷應用程序退到後台

/**
* 程序是否在前台運行
*
*/
public boolean isAppOnForeground() {
ActivityManager activityManager = (ActivityManager) getApplicationContext()
.getSystemService(Context.ACTIVITY_SERVICE);
String packageName = getApplicationContext().getPackageName();
/**
* 獲取Android設備中所有正在運行的App
*/
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.

『陸』 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應用如何監聽自己是否被卸載及卸載反饋功能的實現

一方案:

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去監聽。唯一的辦法就是後台查詢。
整個後台線程,隨時去遍歷

// Get currently running application processes
List<ActivityManager.RunningAppProcessInfo> list = servMng.getRunningAppProcesses();
if(list != null){
for(int i=0;i<list.size();++i){
if("com.android.email".matches(list.get(i).processName)){
int pid = android.os.Process.getUidForName("com.android.email");
android.os.Process.killProcess(pid);
}else{
mTextVIew.append(list.get(i).processName + "\n");
}
}
}

『玖』 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 如何監聽應用切到後台

你對Activity,TabActivity,FrameActvity都寫個Base類,BaseActivity,BaseTabActivity,BaseFrameActvity,在這三個類實現onPause,然後其它繼承它們就好了

閱讀全文

與android監聽應用退出相關的資料

熱點內容
南詔pdf 瀏覽:745
windows如何代碼bat啟動伺服器 瀏覽:454
軟體太卡與伺服器有什麼關系 瀏覽:402
給心理治療師pdf 瀏覽:218
robinhood加密交易條件 瀏覽:310
衛生間解壓方法 瀏覽:450
u盤如何做加密文件放照片 瀏覽:329
文件夾自己加了exe 瀏覽:259
小豬cms直播系統源碼 瀏覽:878
山東廣電雲伺服器 瀏覽:354
javadate與mysqldate 瀏覽:244
javalong比較 瀏覽:11
加密大師看不見加密文件 瀏覽:307
想做一個業余程序員 瀏覽:793
python選出行 瀏覽:249
cat命令windows 瀏覽:910
python算術游戲 瀏覽:532
常微分方程第二版pdf 瀏覽:25
phpJava學多久 瀏覽:724
php博客畢業設計 瀏覽:796