2012-10-07 43 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方法()始终准备好获取系统消息。但是你必须确保你抓住了正确的意图。上面的代码是可以的。 ü粘贴代码里面如果(....){...} –