Android 強制且徹底的退出app
阿新 • • 發佈:2019-01-03
方法1、使用MyApplication.java檔案程式碼如下:
package com.ss.zshcloud.utils;
import android.app.Activity;
import android.app.Application;
import java.util.LinkedList;
import java.util.List;
public class MyApplication extends Application {
//用於將所有activity存在一起用於最後統一finish便於退出
private List<Activity> activityList = new LinkedList<Activity>();
private static MyApplication instance;
private MyApplication()
{
}
//單例模式中獲取唯一的MyApplication例項
public static MyApplication getInstance()
{
if(null == instance)
{
instance = new MyApplication();
}
return instance;
}
//新增Activity到容器中
public void addActivity(Activity activity)
{
activityList.add(activity);
}
//遍歷所有Activity並finish
public void exit()
{
for(Activity activity:activityList)
{
activity.finish();
}
System.exit(0);
}
}
最後再MyApplication.getInstance().exit();方法可以退出那些簡單程式。
方法2、使用System.Exit(0),之前不關閉所有activity和service會重啟app。
方法3、使用SuUtil.java程式碼如下:
package com.ss.zshcloud.utils;
import java.io.IOException;
import java.io.OutputStream;
public class SuUtil {
private static Process process;
/**
* 結束程序,執行操作呼叫即可
*/
public static void kill(String packageName) {
initProcess();
killProcess(packageName);
close();
}
/**
* 初始化程序
*/
private static void initProcess() {
if (process == null)
try {
process = Runtime.getRuntime().exec("su");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 結束程序
*/
private static void killProcess(String packageName) {
OutputStream out = process.getOutputStream();
String cmd = "am force-stop " + packageName + " \n";
try {
out.write(cmd.getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 關閉輸出流
*/
private static void close() {
if (process != null)
try {
process.getOutputStream().close();
process = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
呼叫SuUtil.kill(包名)會完全退出app,但該app需要設定root許可權。
方法4、最後成功的方法
int currentVersion = android.os.Build.VERSION.SDK_INT;
Log.i("println","currentVersion:"+currentVersion+" android.os.Build.VERSION_CODES.ECLAIR_MR1:"+android.os.Build.VERSION_CODES.ECLAIR_MR1);
if (currentVersion > android.os.Build.VERSION_CODES.ECLAIR_MR1) {
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(startMain);
System.exit(0);
} else {// android2.1
ActivityManager am = (ActivityManager)mContext. getSystemService(Context.ACTIVITY_SERVICE);
am.restartPackage(mContext.getPackageName());
}
androidmanifest.xml方要新增許可權:
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/> <uses-permission android:name="android.permission.RESTART_PACKAGES"/>
import android.app.Activity;
import android.app.Application;
import java.util.LinkedList;
import java.util.List;
public class MyApplication extends Application {
//用於將所有activity存在一起用於最後統一finish便於退出
private List<Activity> activityList = new LinkedList<Activity>();
private static MyApplication instance;
private MyApplication()
{
}
//單例模式中獲取唯一的MyApplication例項
public static MyApplication getInstance()
{
if(null == instance)
{
instance = new MyApplication();
}
return instance;
}
//新增Activity到容器中
public void addActivity(Activity activity)
{
activityList.add(activity);
}
//遍歷所有Activity並finish
public void exit()
{
for(Activity activity:activityList)
{
activity.finish();
}
System.exit(0);
}
}
import java.io.IOException;
import java.io.OutputStream;
public class SuUtil {
private static Process process;
/**
* 結束程序,執行操作呼叫即可
*/
public static void kill(String packageName) {
initProcess();
killProcess(packageName);
close();
}
/**
* 初始化程序
*/
private static void initProcess() {
if (process == null)
try {
process = Runtime.getRuntime().exec("su");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 結束程序
*/
private static void killProcess(String packageName) {
OutputStream out = process.getOutputStream();
String cmd = "am force-stop " + packageName + " \n";
try {
out.write(cmd.getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 關閉輸出流
*/
private static void close() {
if (process != null)
try {
process.getOutputStream().close();
process = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}