日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 开机启动服务。

發布時間:2025/1/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 开机启动服务。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 今天我們主要來探討android怎么讓一個service開機自動啟動功能的實現。Android手機在啟動的過程中會觸發一個Standard?Broadcast?Action,名字叫android.intent.action.BOOT_COMPLETED(記得只會觸發一次呀),在這里我們可以通過構建一個廣播接收者來接收這個這個action.下面我就來簡單寫以下實現的步驟:??
  • ? ??第一步:首先創建一個廣播接收者,重構其抽象方法?onReceive(Context?context,?Intent?intent),在其中啟動你想要啟動的Service或app。

  • ? ? import?android.content.BroadcastReceiver;??
  • ????import?android.content.Context;??
  • ????import?android.content.Intent;??
  • ????import?android.util.Log;??
  • ??????
  • ????public?class?BootBroadcastReceiver?extends?BroadcastReceiver?{??
  • ????????//重寫onReceive方法??
  • ????????@Override??
  • ????????public?void?onReceive(Context?context,?Intent?intent)?{??
  • ????????????//后邊的DJY.class就是要啟動的服務??
  • ????????????Intent?service?=?new?Intent(context,DJYclass);??
  • ????????????context.startService(service);??
  • ????????????Log.v("TAG",?"開機自動服務自動啟動.....");??
  • ??????? ? ?//啟動應用,參數為需要自動啟動的應用的包名
  • ? ? Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
  • ? ? context.startActivity(intent?); ?? ? ??
  • ????????}??
  • ??????
  • ????} ?



  • 第二步:配置xml文件,在receiver接收這種添加intent-filter配置??
  • ?????<receiver?android:name="BootBroadcastReceiver">??
  • ????????????????<intent-filter>??
  • ????????????????????<action?android:name="android.intent.action.BOOT_COMPLETED"></action>??
  • ????????????????????<category?android:name="android.intent.category.LAUNCHER"?/>??
  • ????????????????</intent-filter>??
  • ????????????</receiver>??
  • 第三步:添加權限?<uses-permission?android:name="android.permission.RECEIVE_BOOT_COMPLETED"?/> ?


  • 下面參考其它博客的文章:android BraodcastReceiver

    BroadcastReceiver初識:

    廣播接收者(BroadcastReceiver)用于接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,這個特性跟JMS中的Topic消息接收者類似。要實現一個廣播接收者方法如下:
    第一步:繼承BroadcastReceiver,并重寫onReceive()方法。
    public class IncomingSMSReceiver extends BroadcastReceiver {
    ?? ?@Override public void onReceive(Context context, Intent intent) {
    ?? ?}
    }
    第二步:訂閱感興趣的廣播Intent,訂閱方法有兩種:
    第一種:使用代碼進行訂閱
    IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    IncomingSMSReceiver receiver = new IncomingSMSReceiver();
    registerReceiver(receiver, filter);
    第二種:在AndroidManifest.xml文件中的<application>節點里進行訂閱:
    <receiver android:name=".IncomingSMSReceiver">
    ??? <intent-filter>
    ???????? <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    ??? </intent-filter>
    </receiver>



    廣播類型:

    廣播被分為兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,并且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優先級別,被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么,廣播先傳給A,再傳給B,最后傳給C 。優先級別聲明在intent-filter元素的android:priority屬性中,數越大優先級別越高,取值范圍:-1000到1000,優先級別也可以調用IntentFilter對象的setPriority()進行設置 。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,后面的接收者就無法接收到廣播。另外,有序廣播的接收者可以將數據傳遞給下一個接收者,如:A得到廣播后,可以往它的結果對象中存入數據,當廣播傳給B時,B可以從A的結果對象中得到A存入的數據。

    Context.sendBroadcast()
    ?? 發送的是普通廣播,所有訂閱者都有機會獲得并進行處理。

    Context.sendOrderedBroadcast()
    ?? 發送的是有序廣播,系統會根據接收者聲明的優先級別按順序逐個執行接收者,前面的接收者有權終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將數據通過setResultExtras(Bundle)方法存放進結果對象,然后傳給下一個接收者,下一個接收者通過代碼:Bundle bundle = getResultExtras(true))可以獲取上一個接收者存入在結果對象中的數據。

    系統收到短信,發出的廣播屬于有序廣播。如果想阻止用戶收到短信,可以通過設置優先級,讓你們自定義的接收者先獲取到廣播,然后終止廣播,這樣用戶就接收不到短信了。

    廣播接收者的響應:


    在Android中,每次廣播消息到來時都會創建BroadcastReceiver實例并執行onReceive() 方法, onReceive() 方法執行完后,BroadcastReceiver 的實例就會被銷毀。當onReceive() 方法在10秒內沒有執行完畢,Android會認為該程序無響應。所以在BroadcastReceiver里不能做一些比較耗時的操作,否側會彈出ANR(Application No Response)的對話框。如果需要完成一項比較耗時的工作,應該通過發送Intent給Service,由Service來完成。這里不能使用子線程來解決,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結束BroadcastReceiver就先結束了。BroadcastReceiver一旦結束,此時BroadcastReceiver的所在進程很容易在系統需要內存時被優先殺死,因為它屬于空進程(沒有任何活動組件的進程)。如果它的宿主進程被殺死,那么正在工作的子線程也會被殺死。所以采用子線程來解決是不可靠的。

    public class IncomingSMSReceiver extends BroadcastReceiver {
    ?? ?@Override?

    ??? public void onReceive(Context context, Intent intent) {
    ??????????? //發送Intent啟動服務,由服務來完成比較耗時的操作
    ??????????? Intent service = new Intent(context, XxxService.class);
    ??????????? context.startService(service);
    ?? ?}
    }


    常用廣播Intent:

    除了短信到來廣播Intent,Android還有很多廣播Intent,如:開機啟動、電池電量變化、時間已經改變等廣播Intent。
    ?接收電池電量變化廣播Intent ,在AndroidManifest.xml文件中的<application>節點里訂閱此Intent:
    <receiver android:name=".IncomingSMSReceiver">
    ??? <intent-filter>
    ???????? <action android:name="android.intent.action.BATTERY_CHANGED"/>
    ??? </intent-filter>
    </receiver>

    ?接收開機啟動廣播Intent,在AndroidManifest.xml文件中的<application>節點里訂閱此Intent:
    <receiver android:name=".IncomingSMSReceiver">
    ??? <intent-filter>
    ???????? <action android:name="android.intent.action.BOOT_COMPLETED"/>
    ??? </intent-filter>
    </receiver>
    并且要進行權限聲明:
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>



    廣播接收者生命周期

    ?廣播接收者的生命周期是非常短暫的,在接收到廣播的時候創建,onReceive()方法結束之后銷毀

    ?廣播接收者中不要做一些耗時的工作,否則會彈出Application?No?Response錯誤對話框

    ?最好也不要在廣播接收者中創建子線程做耗時的工作,因為廣播接收者被銷毀后進程就成為了空進程,很容易被系統殺掉

    ?耗時的較長的工作最好放在服務中完成!!!



    分享于大家。




  • 轉載于:https://www.cnblogs.com/wuwa/archive/2013/05/23/6191669.html

    總結

    以上是生活随笔為你收集整理的android 开机启动服务。的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。