主进程 (定义一个定时器)我设的是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来做守护进程是上上之选。这里还有很多没有完善的!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐