Service的启动

来源:互联网 发布:网络压力测试工具 编辑:程序博客网 时间:2024/05/01 08:54

一.服务开机启动

        只要实现一个BroadcastReceiver,监听手机启动完成的事件ACTION_BOOT_COMPLETED即可

  • <receiver android:name=".yourReceiver" >
  •         <intent-filter>
  •               <action android:name="android.intent.action.BOOT_COMPLETED" />
  •                <category android:name="android.intent.category.HOME"/>
  •          </intent-filter>
  •  </receiver>

     

    二.服务定时启动

            用户能够在服务里看到这个Service是常驻的。如果用户很敏感,就会停止该Service,甚至直接卸载掉相关的应用。那么,怎样才能定期实现某功能,又不让用户直接看到这个Service呢?聪明的你一定立即就想到了,如果不直接启动Service,而是启动一个timmer,或者alarmManager,然后每隔一段时间去启动Service,做完事情以后关闭掉Service就可以了。

           Timmer在屏幕休眠的状况下,时间会不准.而AlarmManager 是系统闹铃组件,可以一直执行,无论程序启动还是待机.所以一般使用AlarmManager.

     

            1.AlarmManager的主要方法

             取消已经注册的与参数匹配的定时器 ---------------------------    void   cancel(PendingIntent operation)    

             注册一个新的延迟定时器 (只执行一次)-------------------------------------------  void   set(int type, long triggerAtTime, PendingIntent operation)    

            注册一个重复类型的定时器 (按照interval的时间间隔不断执行)------------------- void   setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)   

            注册一个非精密的重复类型定时器 ---------------------- void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)  

            设置时区   ------------------------- void   setTimeZone(String timeZone)  

     

            2.AlarmManager的类型

            public   static   final   int  ELAPSED_REALTIME        // 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。     

           public   static   final   int  ELAPSED_REALTIME_WAKEUP      //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。     

           public   static   final   int  RTC              //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。     

           public   static   final   int  RTC_WAKEUP      //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。     

           Public static   final   int  POWER_OFF_WAKEUP        //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。     

           RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。

     

         3.AlarmManager的停止

     

            repeating AlarmManager一旦启动就会一直在后台运行(除非执行cancel方法),可以在“应用管理”中看到这个应用状态是正在运行。 “强行停止”也可以让Alarmmanager停掉。

           如果我们在AlarmManager启动之后,想修改repeating的频率参数,按照新的频率执行.只有重置long interval,再次启动该AlarmManager,就会凑效.

           如果某个AlarmManager已经启动, 程序又再次去启动它,只要PendingIntent是一样,那么之前那个AlarmManager会被release掉。

     

        4.AlarmManager的使用

      (1).自定义一个BroadcastReceiver

  • package com.yfz;  
  •   
  • import android.content.BroadcastReceiver;  
  • import android.content.Context;  
  • import android.content.Intent;  
  • import android.util.Log;  
  •   
  • /** 
  •  * @author Robot 
  •  * @weibo http://weibo.com/feng88724 
  •  * @date Nov 18, 2011    
  •  */  
  • public class ActionBroadCast extends BroadcastReceiver {  
  •       
  •     private static int num = 0;  
  •     /* (non-Javadoc) 
  •      * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) 
  •      */  
  •     @Override  
  •     public void onReceive(Context context, Intent intent) {  
  •         // TODO Auto-generated method stub  
  •         Log.e("ActionBroadCast""New Message !" + num++);  
  •     }  
  •   
  • }  
  • (2)启动AlarmManager

    1. package com.yfz;  
    2.   
    3. import android.app.Activity;  
    4. import android.app.AlarmManager;  
    5. import android.app.PendingIntent;  
    6. import android.content.Intent;  
    7. import android.os.Bundle;  
    8.   
    9. public class AlarmTestActivity extends Activity {  
    10.     /** Called when the activity is first created. */  
    11.     @Override  
    12.     public void onCreate(Bundle savedInstanceState) {  
    13.         super.onCreate(savedInstanceState);  
    14.         setContentView(R.layout.main);  
    15.           
    16.         AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);  
    17.           
    18.         PendingIntent pi = PendingIntent.getBroadcast(this0new Intent(this, ActionBroadCast.class), Intent.FLAG_ACTIVITY_NEW_TASK);  
    19.         long now = System.currentTimeMillis();  
    20.         am.setInexactRepeating(AlarmManager.RTC_WAKEUP, now, 3000, pi);  
    21.     }  
    22. }  
    23. (3)注册Activity和BroadcastReceiver
    24. <?xml version="1.0" encoding="utf-8"?>  
    25. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    26.     package="com.yfz"  
    27.     android:versionCode="1"  
    28.     android:versionName="1.0" >  
    29.   
    30.     <uses-sdk android:minSdkVersion="7" />  
    31.   
    32.     <application  
    33.         android:icon="@drawable/ic_launcher"  
    34.         android:label="@string/app_name" >  
    35.         <activity  
    36.             android:label="@string/app_name"  
    37.             android:name=".AlarmTestActivity" >  
    38.             <intent-filter >  
    39.                 <action android:name="android.intent.action.MAIN" />  
    40.   
    41.                 <category android:name="android.intent.category.LAUNCHER" />  
    42.             </intent-filter>  
    43.         </activity>  
    44.         <receiver  
    45.             android:name="ActionBroadCast">  
    46.               
    47.         </receiver>  
    48.     </application>  
    49.   
    50. </manifest>