怎样让一个Service开机自动启动

其实参考一下mms 一类的程序就明白了。仿造一份就OK。但是关键是要知道原理。


怎样让一个Service开机自动启动

1.首先开机 启动 后系统会发出一个Standard Broadcast Action,名字叫 android.intent.action.BOOT_COMPLETED ,这个Action只会发出一次。

2. 构造一个BroadcastReceiver类, 重构 其抽象方法onReceive (Context context, Intent intent), 在其中启动你想要启动的Service。

3. Android Manifest.xml中,首先加入 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> 来获得BOOT_COMPLETED的使用许可,然后注册前面重构的IntentReceiver类,在其 <intent-filter> 中加入 <action android:name="android.intent.action.BOOT_COMPLETED" /> ,以使其能捕捉到这个Action。

一个例子

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.xinocomm.device.ps2"
      android:versionCode="1"
      android:versionName="1.0">
   
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>

    <application android:icon="@drawable/icon" android:label="@string/app_name" >
        <service android:name=".Ps2Dev" android:exported="true" />
 
        <receiver android:name=".XinoDeviceReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </receiver>
    </application>

    <uses-sdk android:minSdkVersion="4" />

</manifest>




receiver 部分

package com. xinocomm. device. ps2;

import android. content. BroadcastReceiver;
import android. content. Context;
import android. content. Intent;
import android. widget. Toast;


public class XinoDeviceReceiver extends BroadcastReceiver{
    /*要接收的intent源*/
    static final String ACTION= "android.intent.action.BOOT_COMPLETED";
    
    @Override
    public void onReceive( Context context, Intent intent){
        if ( intent. getAction() . equals( ACTION)) {
            context. startService(new Intent( context, Ps2Dev.class ) ) ; //启动PS2服务

            Toast. makeText( context,"PS2 device monitor service has started!" , Toast. LENGTH_LONG). show( ) ;     
        }         
    }
}


如果是想要启动一个activity的话,则需要加一个flag,

//为了 在Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。如果使用Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task,遇到上面那个异常的,都是因为使用了Context的startActivity方法。解决办法是,加一个flag。    intent .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 如:

    Intent intent = new Intent(context, BabyCareMain.class);
    Intent addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    context.startActivity(intent );

你可能感兴趣的:(怎样让一个Service开机自动启动)