Androidリスニングアプリケーション自体がアンインストールされました


実際の開発では、アプリケーション自体がアンインストールされているかどうか、または近いニーズをリスニングする必要があることが多い.ネット上で長い間実際のやり方を見ていなかったので、システムログをキャプチャすることで、このアプリケーションがアンインストールされているかどうかを検出し、関連する操作を行うことができるという考え方を与えた.
Intent.ACTION_PACKAGE_REMOVEDは、他のアプリケーションがアンインストールされているかどうかだけを傍受し、自身を傍受できないことを意図しています.
この例も、システムログをリスニングすることによって、アプリケーション自体がアンインストールされているかどうかをリスニングします.
LogcatObserver.java
public interface LogcatObserver {
    
    public void handleLog(String info);
}

LogcatScannerService.java
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class LogcatScannerService extends Service implements LogcatObserver {
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        new AndroidLogcatScannerThread(this).start();
    }

    @Override
    public void handleLog(String info) {
        if (info.contains("android.intent.action.DELETE")
                && info.contains(getPackageName())) {
            //do something yourself
        }
    }

    private class AndroidLogcatScannerThread extends Thread {

        private LogcatObserver mObserver;

        public AndroidLogcatScannerThread(LogcatObserver observer) {
            mObserver = observer;
        }

        @Override
        public void run() {
            String[] cmds = { "logcat", "-c" };
            String shellCmd = "logcat";
            Process process = null;
            InputStream is = null;
            DataInputStream dis = null;
            String line = "";
            Runtime runtime = Runtime.getRuntime();
            try {
                mObserver.handleLog(line);
                int waitValue;
                waitValue = runtime.exec(cmds).waitFor();
                mObserver.handleLog("waitValue=" + waitValue
                        + "
Has do Clear logcat cache."); process = runtime.exec(shellCmd); is = process.getInputStream(); dis = new DataInputStream(is); while ((line = dis.readLine()) != null) { if (mObserver != null) mObserver.handleLog(line); } } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException ie) { } finally { try { if (dis != null) { dis.close(); } if (is != null) { is.close(); } if (process != null) { process.destroy(); } } catch (Exception e) { } } } } @Override public IBinder onBind(Intent intent) { return null; } }

呼び出すときはstartService(this,LogcatScannerServices.class)だけでよい.
例自体は、アプリケーション自体がアンインストールされている動作をリスニングできるとテストされていますが、handleLog()メソッドでは時間のかかる操作しかできません.
例自体は、アプリケーション自体がアンインストールされているかどうかを絶えずログを読むことで監視するので、非常に電気的でパフォーマンスが優れています.もし多くのネットユーザーがもっと良い考えがあれば、一緒に討論してもいいですよ.何を覚えてる?