xamarin.android接收器出现BOOT_COMPLETED错误

时间:2018-03-21 09:54:01

标签: c# android visual-studio xamarin service

我正在尝试创建一个以设备启动开始的简单服务。事情是设备返回消息“不幸的是,[app_name]已停止。”

我几个小时都在努力解决这个问题,寻找错误,但这太简单了。希望,你们可以帮我解决这个问题。

这是我的代码:

的AndroidManifest.xml

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

<application android:allowBackup="true" android:label="@string/app_name">


    <receiver android:name=".StartReceiver">
          <intent-filter>
              <action android:name="android.intent.action.BOOT_COMPLETED"/>
          </intent-filter>
    </receiver>

  <service android:name=".PService" />
</application>

StartReceiver.cs

[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionBootCompleted })]
public class StartReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        Intent startIntent = new Intent(context, typeof(PService));
        context.StartService(startIntent);
    }
}

最后是PService.cs

[Service]
    public class PService : Service
    {
        public override void OnCreate()
        {
            base.OnCreate();
        }

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }


        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            Toast.MakeText(this, "Start", ToastLength.Short).Show();
            return StartCommandResult.Sticky;
        }

        public override void OnDestroy()
        {
            base.OnDestroy(); 

            Toast.MakeText(this, "Stop", ToastLength.Short).Show();
        }
    }

此附加服务应用程序的目标是API 19(4.4.2 KitKat)Android版本。

我认为我会犯很小的错误,但我真的无法找到它......提前感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

通过在清单中添加接收器并通过BroadcastReceiverAttribute,您的清单中有两个接收器。另外,清单中的那个将无法工作,因为它不是默认情况下Xamarin创建的基于MD5的Java名称。

通过属性

1)从清单中删除接收者和启动权限

2)通过属性添加启动权限)

[assembly: UsesPermission(Manifest.Permission.ReceiveBootCompleted)]

3)通过属性添加清单条目:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { Intent.ActionBootCompleted })]    
public class BootBroadcastReceiver : BroadcastReceiver

通过清单

1)添加引导权限的清单条目

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

2)添加接收器并使用完全限定的Java类名:

<receiver android:name="com.yourpackagename.app.BootBroadcastReceiver">
      <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED"/>
      </intent-filter>
</receiver>

3)为Name添加BroadcastReceiverAttribute参数,以获取您在清单中使用的完全限定的Java类名称

[BroadcastReceiver(Name = "com.yourpackagename.app.BootBroadcastReceiver", Enabled = true)]
[IntentFilter(new[] { Intent.ActionBootCompleted })]    
public class BootBroadcastReceiver : BroadcastReceiver

答案 1 :(得分:0)

我找到了解决该问题的另一种方法,

请确保您的BootBroadcastReceiver存在于 Yourproject.Android.csproj 文件

<ItemGroup>
    <Compile Include="MainActivity.cs" />
    <Compile Include="Provider\AppVersionProvider.cs" />
    <Compile Include="Resources\Resource.Designer.cs" />
    <Compile Include="Properties\BootBroadcastReceiver.cs" />
    <Compile Include="others_staf" />

然后查看SushiHangover的答案。