您的位置:首页 > 移动开发 > Android开发

【Android代码片段之九】监听Android系统Log

2012-06-14 10:04 253 查看
转载请注明出处,原文网址:/article/1656877.html作者:张燕广

实现原理:1)执行logcat命令;

2)在service中把监听到的log内容通过广播发送出去;

3)Client端接收广播,获取log内容;

4)注意,添加读取log的权限<uses-permission android:name="android.permission.READ_LOGS"/>

为什么要监听Log?

通过分析log可以监听系统安装、卸载软件等操作。

具体实现,见代码:

监听log的服务LogObserverService,代码如下:

package com.isoft.log;

import java.io.DataInputStream;
import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

public class LogObserverService extends Service implements Runnable{
	private String TAG = "LogObserverService";
	private boolean isObserverLog = false;
	private StringBuffer logContent = null;
	private Bundle mBundle = null;
	private Intent mIntent = null;
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		Log.i(TAG,"onCreate");
		mIntent = new Intent();
		mBundle = new Bundle();
		logContent = new StringBuffer();
		startLogObserver();
	}

	/**
	 * 开启检测日志
	 */
	public void startLogObserver() {
		Log.i(TAG,"startObserverLog");
		isObserverLog = true;
		Thread mTherad = new Thread(this);
		mTherad.start();
	}

	/**
	 * 关闭检测日志
	 */
	public void stopLogObserver() {
		isObserverLog = false;
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		stopLogObserver();
	}

	/**
	 * 发送log内容
	 * @param logContent
	 */
	private void sendLogContent(String logContent){
		mBundle.putString("log",logContent);
		mIntent.putExtras(mBundle);
		mIntent.setAction(LogObserverActivity.LOG_ACTION);
		sendBroadcast(mIntent);
	}
	
	
	@Override
	public void run() {
		Process pro = null;
		try {
			Runtime.getRuntime().exec("logcat -c").waitFor();
			
			pro = Runtime.getRuntime().exec("logcat");
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		DataInputStream dis = new DataInputStream(pro.getInputStream());
		String line = null;
		while (isObserverLog) {
			try {
				while ((line = dis.readLine()) != null) {
					String temp = logContent.toString();
					logContent.delete(0, logContent.length());
					logContent.append(line);
					logContent.append("\n");
					logContent.append(temp);
					//发送log内容
					sendLogContent(logContent.toString());
					Thread.yield();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
使用log监听服务的Client端LogObserverActivity,代码如下:

package com.isoft.log;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class LogObserverActivity extends Activity {
	private String TAG = "LogObserverActivity";
	public static String LOG_ACTION = "com.isoft.log.LOG_ACTION";
	private TextView logContent = null;
	private Button start = null;
	private Intent logObserverIntent = null;
	private LogBroadcastReceiver mLogBroadcastReceiver = null;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//初始化视图
		initView();
		//注册log广播接收者
		registerLogBroadcastReceiver();
	}

	private void initView() {
		logContent = (TextView) findViewById(R.id.logContent);
		logContent.setText("show log");
		start = (Button)findViewById(R.id.start);
		start.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				startLogObserverService();
				start.setEnabled(false);
			}
		});
	}

	private void startLogObserverService() {
		logObserverIntent = new Intent(this, LogObserverService.class);
		startService(logObserverIntent);
	}

	/**
	 * 注册log广播接收者
	 */
	private void registerLogBroadcastReceiver(){
		mLogBroadcastReceiver = new LogBroadcastReceiver();
		IntentFilter filter = new IntentFilter();
		filter.addAction(LOG_ACTION);
		registerReceiver(mLogBroadcastReceiver, filter);
	}
	
	/**
	 * log 广播接收者
	 * @author zhangyg
	 *
	 */
	private class LogBroadcastReceiver extends BroadcastReceiver{
		private String action = null;
		private Bundle mBundle = null;
		@Override
		public void onReceive(Context context, Intent intent) {
			action = intent.getAction();
			if(LOG_ACTION.equals(action)){
				mBundle = intent.getExtras();
				logContent.setText(mBundle.getString("log"));
			}
		}
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		stopService(logObserverIntent);
		unregisterReceiver(mLogBroadcastReceiver);
	}
}
运行效果截图如下:



点击下载源代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: