2012-10-07 44 views
2

我有一個類MyBroadcastReceiver註冊啓動時啓動。清單如下。我通過eclipse在安卓摩托羅拉Xoom無線平板電腦上運行 - 這是Android 3.2,API級別13(來自dev.android站點)。Android:廣播接收器不會收到啓動消息

我用Google搜索了這一點,並嘗試了幾件事情:

  • android:exported="true"

  • 使用android:installLocation="internalOnly",以確保它不會SD卡

  • 上安裝後安裝在設備上,我測試了啓動之前運行了幾次應用程序(因爲有些鏈接表示Android 3.x以上版本不會立即開始嚮應用程序發送啓動事件,除非用戶已經手動啓動它至少有一次)

但是即使現在廣播接收機似乎沒有運行時,設備啓動(基於logcat)。

這裏是我的清單文件:

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

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

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".MainCamApp" android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     </activity> 

    <service android:name=".UploaderService" /> 

    <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     </intent-filter> 
    </receiver> 

    </application> 
</manifest> 

規範廣播接收器 -

import java.util.Calendar; 

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class MyBroadcastReceiverX extends BroadcastReceiver { 
    private String TAG = "Broadcast Receiver:"; 
    AlarmManager alarm; 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     Log.i(TAG, "Entered onReceive."); 
     alarm = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE); 
     Intent intentUploadService = new Intent (arg0, UploaderService.class); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.add(Calendar.SECOND, 10); 

     PendingIntent pi = PendingIntent.getBroadcast(arg0, 0, intentUploadService , 0); 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5000, pi); 
     Log.i(TAG, "Alarm set. Exiting onReceive."); 

     Intent myIntent = new Intent(arg0, UploaderService.class); 
     arg0.startService(myIntent); 
    } 

} 

似乎是現在的工作..低於最終清單,如果有幫助 -

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example" 
     android:versionCode="1" 
     android:versionName="1.0" 
     android:installLocation="internalOnly" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 

    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

    <uses-sdk android:minSdkVersion="8" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".MainCamApp" android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     </activity> 

    <service android:name=".UploaderService" /> 

    <receiver android:name=".MyBroadcastReceiverX" android:enabled="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"> 
      <category android:name="android.intent.category.DEFAULT"/> 
      </action> 
     </intent-filter> 
    </receiver> 

    </application> 
</manifest> 

回答

3

請嘗試以下操作:

<receiver android:name=".MyBroadcastReceiverX" android:enabled="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"> 
     <category android:name="android.intent.category.DEFAULT"/> 
     </action> 
    </intent-filter> 
</receiver> 

您還可以在清單中指定不正確的類的名字 - 它應該是MyBroadcastReceiverX而不是MyBroadcastReceiver

+0

您好,感謝我試過這個..重新安裝,啓動它手動兩次,重新啓動後,檢查日誌。但廣播接收機不會觸發。我正在編輯我的帖子,以包含接收器類也。 – vikramagain

+0

您需要更正您的接收器類名稱(最後添加X)。我已經編輯了我的答案 – HitOdessit

+0

嗨,是的,我的不好..我今天早上在試用東西時放了X.將現在嘗試。 – vikramagain

0

u需要接受android.intent.action.BOOT_COMPLETED意圖後寫代碼。

試試這個。

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.d("TEST", intent.getAction()); 
    if (intent.getAction().equalsIgnoreCase(
      "android.intent.action.BOOT_COMPLETED")) { 
     Log.i(TAG, "Entered onReceive."); 
    alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intentUploadService = new Intent (context, UploaderService.class); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 10); 

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intentUploadService , 0); 
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5000, pi); 
    Log.i(TAG, "Alarm set. Exiting onReceive."); 

    //no need to initialize intent twice 
    // Intent myIntent = new Intent(context, UploaderService.class); 

context.startService(intentUploadService); 
    } 

} 
+0

@ user1714373:回覆plz –

+0

hi shihab,這是必需的嗎?通過沒有if {},它會響應任何事件(按定義,BOOT_COMPLETED),對嗎? – vikramagain

+0

@ user1714373:親愛的,在onReceive方法()始終準備好獲取系統消息。但是你必須確保你抓住了正確的意圖。上面的代碼是可以的。 ü粘貼代碼裏面如果(....){...} –