为什么不调用BroadcastReceiver?

时间:2016-10-13 00:04:57

标签: xamarin xamarin.android broadcastreceiver bootcompleted

即使使用此命令启动系统,BootReceiver也从未调用过:

  

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.canbedeleted.test / .BootReceiver

允许我放入清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.android.canbedeleted.test">
<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:label="test">
<receiver android:name="test.Droid.BootReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
</receiver>
</application>

接收器标签我试过删除它但没有看到任何不同。

[BroadcastReceiver]
[IntentFilter (new string[] { Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.HighPriority)]
public class BootReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    { 
        System.Diagnostics.Debug.WriteLine ("*********************************** Broadcast Received *********************************");
        Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
        //Intent message = new Intent();
        //message.AddFlags(ActivityFlags.NewTask);
        //message.SetClass(context, typeof(KeyboardService));
        //context.StartService(intent);
    }
}

即使我尝试像这样输入cmd,我也会有如下的堆栈跟踪。 test.Droid是该类的命名空间。

  

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.canbedeleted.test / test.Droid.BootReceiver

栈跟踪

  

Java.Lang.RuntimeException:无法实例化接收器test.Droid.BootReceiver:java.lang.ClassNotFoundException:未找到类&#34; test.Droid.BootReceiver&#34; on path:DexPathList [[zip file&#34; /data/app/com.android.canbedeleted.test-8.apk"],nativeLibraryDirectories = [/ data / app-lib / com.android.canbedeleted.test -8,/ vendor / lib,/ system / lib]] ---&gt; Java.Lang.ClassNotFoundException:找不到类&#34; test.Droid.BootReceiver&#34; on path:DexPathList [[zip file&#34; /data/app/com.android.canbedeleted.test-8.apk"],nativeLibraryDirectories = [/ data / app-lib / com.android.canbedeleted.test -8,/ vendor / lib,/ system / lib]]     在java.lang.ClassNotFoundException:没找到类&#34; test.Droid.BootReceiver&#34; on path:DexPathList [[zip file&#34; /data/app/com.android.canbedeleted.test-8.apk"],nativeLibraryDirectories = [/ data / app-lib / com.android.canbedeleted.test -8,/ vendor / lib,/ system / lib]]     at at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)     在java.lang.ClassLoader.loadClass(ClassLoader.java:497)     在java.lang.ClassLoader.loadClass(ClassLoader.java:457)     在android.app.ActivityThread.handleReceiver(ActivityThread.java:2513)     at android.app.ActivityThread.access $ 1800(ActivityThread.java:161)     在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1341)     在android.os.Handler.dispatchMessage(Handler.java:102)     在android.os.Looper.loop(Looper.java:157)     在android.app.ActivityThread.main(ActivityThread.java:5356)     at at java.lang.reflect.Method.invokeNative(Native Method)     at at java.lang.reflect.Method.invoke(Method.java:515)     在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1265)     在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)     at at dalvik.system.NativeStart.main(Native Method)     ---内部异常堆栈跟踪结束---     at java.lang.RuntimeException:无法实例化接收器test.Droid.BootReceiver:java.lang.ClassNotFoundException:未找到类&#34; test.Droid.BootReceiver&#34; on path:DexPathList [[zip file&#34; /data/app/com.android.canbedeleted.test-8.apk"],nativeLibraryDirectories = [/ data / app-lib / com.android.canbedeleted.test -8,/ vendor / lib,/ system / lib]]     在android.app.ActivityThread.handleReceiver(ActivityThread.java:2518)     at android.app.ActivityThread.access $ 1800(ActivityThread.java:161)     在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1341)     在android.os.Handler.dispatchMessage(Handler.java:102)     在android.os.Looper.loop(Looper.java:157)     在android.app.ActivityThread.main(ActivityThread.java:5356)     at at java.lang.reflect.Method.invokeNative(Native Method)     at at java.lang.reflect.Method.invoke(Method.java:515)     在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1265)     在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)     at at dalvik.system.NativeStart.main(Native Method)     at引发者:java.lang.ClassNotFoundException:没找到类&#34; test.Droid.BootReceiver&#34; on path:DexPathList [[zip file&#34; /data/app/com.android.canbedeleted.test-8.apk"],nativeLibraryDirectories = [/ data / app-lib / com.android.canbedeleted.test -8,/ vendor / lib,/ system / lib]]     at at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)     在java.lang.ClassLoader.loadClass(ClassLoader.java:497)     在java.lang.ClassLoader.loadClass(ClassLoader.java:457)     在android.app.ActivityThread.handleReceiver(ActivityThread.java:2513)     在...... 10多个

2 个答案:

答案 0 :(得分:0)

com.android.canbedeleted.test/test.Droid.BootReceiver可能不正确。

  

在5.0版本中,Android Callable Wrappers的默认包名称将基于要导出类型的程序集限定名称的MD5SUM。这允许从两个不同的程序集提供相同的完全限定名称,而不会出现打包错误。

检查项目的 \ _ obj \ Debug \ android \ AndroidManifest.xml 文件下生成的BootReceiver名称是什么。

详细了解Android Callable Wrapper命名主题here

答案 1 :(得分:0)

请删除AndroidManifest.xml中的接收者。如果您使用BroadcastReceiverIntentFilter等属性,则无需在此处声明。否则生成的清单(\obj\Debug\android\AndroidManifest.xml)将包含接收器的两个声明,这可能会导致一些问题。使用这些属性有一个好处,那就是你不必关心正确的类名。