2
int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.main);

    Button start = (Button) findViewById(R.id.start);

    start.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {

                    try {

                        String[] cmd = new String[] { "logcat", "-f",Environment.getExternalStorageDirectory()+"/log.txt", "-v", "time" };
                        Runtime.getRuntime().exec(cmd);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            });

            thread.start();

        }
    });

    Button stop = (Button) findViewById(R.id.stop);

    stop.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            try {
                Runtime.getRuntime().exec("logcat -d");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
    });

    Button addLog = (Button) findViewById(R.id.addLog);

    addLog.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Log.e("logTag", Integer.toString(count));
            count ++ ;

        }
    });
}

startボタンを使用してアプリのログの保存を開始し、を使用して停止したいstop。このaddLogボタンは、さらに行がファイルに追加されているかどうかを確認するために使用されlog.txtます。ボタンはstart正常に機能しますが、問題は で終わらないことstopです。を押した後も、ボタンstopを押して ファイルaddLogを確認すると、最後の行が追加されています。log.txt私のせいは何ですか?

ストリームを開始し、このアクティビティを閉じて、他のアクティビティのツアーに参加し、戻ってロギング マシンをシャットダウンする必要があります。

4

2 に答える 2

3

はい、ランタイムの exec() メソッドによって返される変数にプロセスを保存し、destroy()その変数を呼び出すことでそれを実現できます。

公共の抽象ボイドを破壊する ()

このプロセスを終了し、関連するすべてのストリームを閉じます。

Process をグローバル変数として記録しましょう。

private Process p;

そしてそれを実行するとき

p = Runtime.getRuntime().exec(cmd);

そして、これがどのように停止したかです。

void stopProcess() {
     if (p != null) {
         p.destroy();
     } else {
         Log.d(TAG, "stopProcess: p==null");
     }
}
于 2015-05-20T16:27:17.170 に答える
1

@hegazy メソッドを使用して、Applicationクラスのプロセスへの参照を保存するだけです。マニフェストに登録することを忘れないでください。あなたが私の考えを持っていることを願っています。

そんな感じ:

((App)getApplicationContext).process = Runtime.getRuntime().exec(cmd);

必要なときにこれを取るよりも:

((App)getApplicationContext).process.exec("logcat -d");
于 2015-05-20T17:05:40.757 に答える