android基础教程之开机启动示例
manifest.xml文件:
<service
android:name=".daemonservice"
android:enabled="true"
android:process=".daemonservice" >
<intent-filter android:priority="1000">
<action android:name="cn.test.daemonservice" />
<category android:name="android.intent.category.default" />
</intent-filter>
</service>
注释:因为我们这个服务要一直在后台运行,所以不采用bindservice的方式,而是直接采用startservice的方式。
这样就不至于我们的程序结束,也把我们的服务也结束掉了。
package cn.start.test;
import java.util.list;
import android.annotation.suppresslint;
import android.app.activitymanager;
import android.app.service;
import android.app.activitymanager.runningappprocessinfo;
import android.content.intent;
import android.os.handler;
import android.os.ibinder;
import android.util.log;
public class daemonservice extends service {
private static final string tag = "alarmreceiver";
handler hd1 = new handler();
int delay = 5000;
public ibinder onbind(intent intent) {
// todo auto-generated method stub
return null;
}
@suppresslint("newapi")
public void oncreate() {
system.out.println("服务启动成功。。。。。。。。。。");
hd1.postdelayed(mtasks, delay);
}
private runnable mtasks = new runnable() {
@suppresslint("newapi")
public void run() {
android.os.process.setthreadpriority(android.os.process.thread_priority_foreground);
if (checkmainappisactive()) {
log.d(tag, "服务检测主应用还在运行");
} else {
log.d(tag, "服务检测主应用已经关闭");
intent intent = getpackagemanager().getlaunchintentforpackage(
"cn.start.test");
if (intent != null) {
daemonservice.this.startactivity(intent);
log.d(tag, "服务启动主应用程序。");
} else {
log.d(tag, "服务检测到没有安装主应用,自动退出。");
return;
}
}
hd1.postdelayed(mtasks, delay);
}
};
/**
* 检测是否主程序是否还在运行
* @return
*/
@suppresslint({ "newapi", "newapi" })
public boolean checkmainappisactive(){
activitymanager am = (activitymanager) getsystemservice(activity_service);
//获取正在运行的应用
list<runningappprocessinfo> run = am.getrunningappprocesses();
for(runningappprocessinfo ra : run){
if(ra.processname.equals("cn.start.test")){
return true;
}
}
return false;
}
}
开机自动启动程序,自然少不了开机启动广播了。
manifest.xml 文件:
<receiver android:name=".startupreceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.boot_completed" />
</intent-filter>
</receiver>
public class startupreceiver extends broadcastreceiver {
@override
public void onreceive(context context, intent intent) {
// todo auto-generated method stub
intent i = new intent(context,loginactivity.class);
i.setflags(intent.flag_activity_new_task);
context.startactivity(i);
intent serviceintent = new intent(context,daemonservice.class);
context.startservice(serviceintent);
}
}
总结:开机启动广播一定在manifest文件中注册好。定时器要注意定时延迟。
通过list<runningappprocessinfo> run = am.getrunningappprocesses();判断自己的进程是否还在运行
通过getpackagemanager().getlaunchintentforpackage( "cn.start.test"); getpackagemanager().getlaunchintentforpackage( "cn.start.test");
来启动自己的程序。