欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android基础教程之开机启动示例

程序员文章站 2022-06-19 19:50:14
manifest.xml文件:复制代码 代码如下:

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");

来启动自己的程序。