Android中如何像 360 一樣優雅的殺死后臺服務而不啟動

jopen 10年前發布 | 103K 次閱讀 Android Android開發 移動開發

Android中,雖然有很多方法(API或者shell命令)殺死后臺`service`,但是仍然有很多程序幾秒內再次啟動,導致無法真正的殺死。這里主要著重介紹如何像 360 一樣殺死Android后臺服務,而不會再次啟動。

一、已知的 kill 后臺應用程序的方法

  • android.os.Process.killProcess(pid);
  • activityManager.killBackgroundProcesses(pkgName);
  • kill -9 pid
  • </ul>

    這三種方法都可以“殺死”后臺應用程序,但是都會自啟動,對于前面兩種直接使用Android的API就行了,所以就不多介紹了。這里稍微介紹一下 最后一個方法的用法: kill -9 pid;

    方法: kill -9 pid

    這其實是一條shell 命令,我們知道Android的底層是Linux系統,所以在Android上可以使用所有的Linux終端命令。那么如何結合在代碼中呢,貼一段代碼

    private void killProcess(String pid) {
        Process sh = null;
        DataOutputStream os = null;
        try {
            sh = Runtime.getRuntime().exec("su");
            os = new DataOutputStream(sh.getOutputStream());
            final String Command = "kill -9 " + pid + "\n";
            os.writeBytes(Command);
            os.flush();
    
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        try {
            sh.waitFor();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    }

    該方法最重要的功能就是告訴你,怎么在Android程序中執行Linux shell 命令


    二、終極方法,殺死后臺service而不自啟動: am (Activity Manager)命令

    相信很多人對 am 命令都挺熟悉的,它是Android系統中/system/bin/目錄下的一條命令。不僅可以在終端下啟動一個應用程序,還可以啟動Service,發送 broadcast以及Intent actionforce stop process 等等,功能非常強大。這里我們要用到一個功能就是強制停止應用程序!
    對于命令 am 的介紹與用法,官網給的非常情況,請參照Android 官網: http://developer.android.com/tools/help/adb.html#am

    我們用到的方法和功能是:am force-stop <PACKAGE>
    下面是我們的代碼舉例

    private void forceStopAPK(String pkgName){
        Process sh = null;
        DataOutputStream os = null;
        try {
            sh = Runtime.getRuntime().exec("su");
            os = new DataOutputStream(sh.getOutputStream());
            final String Command = "am force-stop "+pkgName+ "\n";
            os.writeBytes(Command);
            os.flush();
    
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        try {
            sh.waitFor();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    通過上面的這段代碼,我們調用forceStopAPK方法,傳遞一個應用程序的包名,那么我們就可以殺死對應的Android程序,而不會自動啟動。親測:微信,淘寶,酷我,等一系列應用,殺死后不會再啟動!

    來自:http://my.oschina.net/u/561492/blog/277813

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!