android 心跳检测机制,用心跳机制来监测一个activity 是否正常运行!
主进程(定义一个定时器)我设的是2秒发送一个广播消息给守护进程(用Broadcast),守护进程收到广播消息后作出如下反应:1.因为定义的UDP接收类会近似和发送方同步!2.在自定义的一个线程中不断调用UDP类这是监控程序:packagecom.example.xintiao;importandroid.app.Service;importandroid.content.BroadcastRec.
主进程 (定义一个定时器)我设的是2秒发送一个广播消息给守护进程(用Broadcast),
守护进程收到广播消息后作出如下反应:
1.因为定义的UDP接收类会近似和发送方同步!
2.在自定义的一个线程中不断调用UDP类
这是监控程序:
packagecom.example.xintiao;
importandroid.app.Service;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.IBinder;
importandroid.util.Log;
publicclassjiankongextendsService{
MainActivity myactivity;
staticString name=null;
staticintcount=0;
staticintmount=0;///这是一个检测变量
intkeep=0;
intj=0;
booleancondition=true;
@Override
publicIBinder onBind(Intent arg0) {
returnnull;}
publicvoidonDestroy(){
Log.i("Service","getout");}
publicvoidonStart(finalIntent intent,intstartid){
Thread thread=newThread(newRunnable(){
@Override
publicvoidrun() {
while(condition){
if(count==5) keep=(count-mount);
UDP.onReceive(getApplicationContext(), intent);
try{
Thread.sleep(1000);
}catch(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(keep);
if(keep!=count-mount) j++;
if((count>10)&&(j>=5)){
MyApp.myactivity.finish();
try{
Thread.sleep(1000);
}catch(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Intent t =newIntent(jiankong.this,MainActivity.class);
t.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(t);
count=0;mount=0;keep=0; j=0;
}
}}});
thread.start();
}
publicstaticBroadcastReceiver UDP=newBroadcastReceiver(){
publicvoidonReceive(Context context, Intent intent) {
name=intent.getStringExtra("msg");
if(name==null)
{count++;}
else
{Log.i("mainactivity",name);
mount++;
}
}};
}
这是自定义的一个类,用于在service中可以方便的获取mainactivity的实例:
packagecom.example.xintiao;
importandroid.app.Application;
publicclassMyAppextendsApplication{
publicstaticMainActivity myactivity;
publicvoidsetInstance(MainActivity instance){
myactivity=instance;
}
publicMainActivity getInstance() {
// TODO Auto-generated method stub
returnmyactivity;
}
}
这是mainactivity的程序:
packagecom.example.xintiao;
importjava.util.Timer;
importjava.util.TimerTask;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
publicclassMainActivityextendsActivity
{intcount;
Timer mTimer =newTimer();//定义一个计时器0
publicString myaction="com.example.xintiao.action.myserver";
publicvoidonCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1, button2;
button1=(Button)findViewById(R.id.time);
button2=(Button)findViewById(R.id.time2);
//保存activity实列
((MyApp)getApplication()).setInstance(this);
button2.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(View v){
mTimer.cancel();
}
});
button1.setOnClickListener(newOnClickListener() {
@Override
publicvoidonClick(View v) {
Intent intent=newIntent();//启动Service
intent.setAction(myaction);
startService(intent);
mTimer.schedule(newTimerTask() {
@Override
publicvoidrun() {
IntentFilter filter =newIntentFilter("com.example.xintiao");
registerReceiver(jiankong.UDP, filter);
Intent intent=newIntent();
intent.setAction("com.example.xintiao");
intent.putExtra("msg","good");
sendBroadcast(intent);
System.out.println("send now!!");
}
},2*1000,2*1000);
}
});}
publicvoidonStop(){
super.onStop();
}
publicvoidonRestart(){
super.onRestart();
}
publicvoidonStart(){super.onStart();}
publicvoidshow(){System.out.println("到位,宁静以致远");}
publicvoidonDestroy(){super.onDestroy();}
}
androidmanifest文件:
package="com.example.xintiao"
android:versionCode="1"
android:versionName="1.0"
>
android:minSdkVersion="8"
android:targetSdkVersion="15"
/>
android:name=".MyApp"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
android:name=".MainActivity"
android:label="@string/title_activity_main" >
/>
总结:这里采用的就是心跳机制,我最后选择了广播!细节问题主要集中在怎样判断activity出现异常,我这里设置了mount 和count二个变量,当它们之差不断变化时,说明出现了异常,因为他们都是在固定时间的获取,如果没有出现异常时它们之间的差是不会变化的!
这里必须要service 来监测,因为activity我们很难把握它们的生命周期,所以用后台service来做守护进程是上上之选。这里还有很多没有完善的!
更多推荐
所有评论(0)