Android 安卓可以';我找不到我的收音机。我做错了什么?
我正在尝试创建一个在启动时启动的服务 我在adb中看到以下错误:Android 安卓可以';我找不到我的收音机。我做错了什么?,android,broadcastreceiver,xamarin.android,Android,Broadcastreceiver,Xamarin.android,我正在尝试创建一个在启动时启动的服务 我在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.MyBoot
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
<?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);
}
}
}
}
}
问题是,我可以肯定地看到,mybootceiver
类作为MyClass
的子类存在于MyNameSpace
中,因此它看起来应该能够找到它
我的清单定义为:
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
<?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);
}
}
}
}
}
我需要做什么才能让它工作?在描述清单文件中的项目时,我通常会添加整个类路径。所以在你的情况下,我会写:
<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>
我也面临同样的问题,并找到了解决办法。按照以下步骤使“内部”广播接收器工作而不发生任何故障:
1) 使您的主要活动如下所示:
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{} ...
}
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());
}
}
}
}
<receiver android:name="com.example.yourproject.YourMainActivityName$MyReceiver" android:enabled="true">
<intent-filter>
<action android:name="MyBroadcast" >
</action>
</intent-filter>
</receiver>
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) 现在,将内部BroadcastReceiver添加到onPause()的正下方或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{} ...
}
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());
}
}
}
}
<receiver android:name="com.example.yourproject.YourMainActivityName$MyReceiver" android:enabled="true">
<intent-filter>
<action android:name="MyBroadcast" >
</action>
</intent-filter>
</receiver>
4) 最后,确保已将内部BroadcastReceiver路径添加到清单中,如下所示:
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{} ...
}
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());
}
}
}
}
<receiver android:name="com.example.yourproject.YourMainActivityName$MyReceiver" android:enabled="true">
<intent-filter>
<action android:name="MyBroadcast" >
</action>
</intent-filter>
</receiver>
谢谢-应该是MyNameSpace.MyClass.MyBootReceiver
而不是MyNameSpace.MyBootReceiver
?…刚刚尝试。。在名称空间前面加前缀没有帮助。事实上,它使事情变得更复杂,例如,无法实例化receiver MyNameSpace.MyClass.MyNameSpace.MyClass.MyBootReceiver
@DaveDev,我怀疑您的名称声明中有句点作为第一个字符。我有-如果没有句点,我会得到一个部署错误:部署失败,因为内部错误:意外的安装输出:pkg:/data/local/tmp/MyNamespace.MyClass-Signed.apk失败[install\u PARSE\u failed\u MANIFEST\u畸形]