3

我正在尝试创建一个将在启动时启动的服务。

我在 adb 中看到以下错误:

05-31 10:14:24.060 E/AndroidRuntime( 1583):java.lang.RuntimeException: Unable to instantiate receiver MyNameSpace.MyClass.MyBootReceiver: java.lang.ClassNotFoundException: Didn't find class "MyNameSpace.MyClass.MyBootReceiver" on path: /data/app/MyNameSpace.MyClass-1.apk
05-31 10:14:24.060 E/AndroidRuntime( 1583): Caused by: java.lang.ClassNotFoundException: Didn't find class "MyNameSpace.MyClass.MyBootReceiver" on path: /data/app/MyNameSpace.MyClass-1.apk

问题是,我绝对可以看到该类作为 的子MyBootReceiver类存在于中,因此看起来应该能够找到它。MyNameSpaceMyClass

我的清单定义为:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          android:versionCode="1" 
          android:versionName="1.0" 
          package="MyNamespace.MyClass">
    <uses-sdk />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

  <application>
    <receiver android:name=".MyBootReceiver">
      <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
    </receiver>
    <activity android:name=".MyActivity"></activity>

  </application>    
</manifest>

这是代码:

namespace MyNamespace
{
    [Service]
    [IntentFilter(new String[] { "com.xamarin.MyClass" })]
    public class MyClass : IntentService
    {
        private IBinder binder;

        public const string MyUpdatedAction = "MyUpdated";

        protected override void OnHandleIntent(Intent intent)
        {
            var myIntent = new Intent(MyUpdatedAction);

            SendOrderedBroadcast(myIntent, null);
        }

        public override IBinder OnBind(Intent intent)
        {
            binder = new MyServiceBinder(this);
            return binder;
        }

        [BroadcastReceiver]
        [IntentFilter(new string[] { MyUpdatedAction }, Priority = (int)IntentFilterPriority.LowPriority)]
        public class MyBootReceiver : BroadcastReceiver
        {
            public override void OnReceive(Context context, Android.Content.Intent intent)
            {
                Log.Info("MyTrace", "MyReceiver OnReceive action: " + intent.Action);

                if (intent.Action.Contains("BOOT_COMPLETED"))
                {
                    var pushIntent = new Intent(MyUpdatedAction);
                    context.StartService(pushIntent);

                }
            }
        }
    }
}

我需要做什么才能让这件事发挥作用?

4

2 回答 2

0

我通常在描述清单文件中的项目时添加整个类路径。所以在你的情况下,我会写:

<application>
    <receiver android:name="MyNamespace.MyBootReceiver">
      <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
    </receiver>
<activity android:name="MyNamespace.MyActivity"></activity>

这可能与为什么这个简单的服务没有启动一样的问题?.

于 2013-05-31T10:57:12.187 回答
0

我面临同样的问题并找到了解决方案。请按照以下步骤使您的“内部”广播接收器正常工作而不会发生任何崩溃:

1)让你的 mainActivity 看起来像这样:

public class MainActivity extends AppCompatActivity
    implements SomeListener {
        MyReceiver myRecvr;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           myRecvr = new MyReceiver();  
           .......
        }

    ...onResume() code ... onPause() code ... yourBroadcastReceiver Class{} ...


}

2) 在 onResume() 中注册您的接收器并在 onPause() 中取消注册您的接收器,如下所示:

@Override
public void onResume() {
    Log.e("DEBUG", "onResume()");
    final IntentFilter filter = new IntentFilter();
    filter.addAction("MyBroadcast");

    registerReceiver(myRecvr, filter);
    super.onResume();
}

@Override
public void onPause() {
    Log.e("DEBUG", "OnPause()");
    unregisterReceiver(myRecvr);
    super.onPause();
}

3) 现在在 onPause() 正下方或 mainActivity 类结束之前添加您的内部广播接收器,如下所示:

public static class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            if(extras.containsKey("value")){
                Log.e("BroadcastedValue",extras.get("value").toString());
            }
        }
    }
}

4)最后,确保您已将内部 BroadcastReceiver 路径添加到清单中,如下所示:

<receiver android:name="com.example.yourproject.YourMainActivityName$MyReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="MyBroadcast" >
            </action>
        </intent-filter>
    </receiver>
于 2016-07-26T08:17:51.607 回答