Xamarin IntentService由HardwareButton

时间:2016-07-25 06:55:46

标签: c# android service xamarin intentservice

我现在已经尝试了好几天才能运行,但没有任何成功。

我正在尝试通过其特定SDK(它是Panasonic Toughpad)的功能对我的掌上电脑的硬件按钮做出反应。我在Xamarin中生成了这个代码,我在Java中获得了一个SDK示例。

这是我的代码:

首先是服务本身。 服务类:

[Service]
    [IntentFilter(new[] { "com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON" } )]
    class ButtonIntentService : IntentService
    {
        public ButtonIntentService() :base("ButtonIntentHandlerThread"){ }

        protected override void OnHandleIntent(Intent intent)
        {
            if (!intent.Action.Equals(AppButtonManager.ActionAppbutton))
            {
                return;
            }

            if (ButtonTestFragment.getInstance() !=null)
            {
                ButtonTestFragment.getInstance().updateButtonState(intent);
            }
            else
            {

            }
        }

这是AndroidManifest的代码剪辑。 AndroidManifest:

    <service
        android:enabled="true"
        android:name="com.SoftwareTestXamarin.Droid.ButtonIntentService"
        android:label="button api Sample"
        android:exported="true">
  <intent-filter>
    <action android:name="com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON"/>
  </intent-filter>
</service>

我是这个连接东西的新手。在我的想法中,意图现在应该通过过滤器听到HandheldButtons。因此,当我点击我的掌上电脑的AppButton时,它应该启动IntentServices功能?!?还是我错了? 在我的意见中,他们在Java样本中做了同样的事情。

代码:

服务类:

public class ButtonIntentService extends IntentService {

    public ButtonIntentService() {
        super("Button Intent Handler Thread");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (!intent.getAction().equals(AppButtonManager.ACTION_APPBUTTON)) {
            // Ignore..
            return;
        }

        if (ButtonTestFragment.getInstance() != null) {
            ButtonTestFragment.getInstance().updateButtonState(intent);
        }

    }

AndroidManifest:

<service
            android:name="com.panasonic.toughpad.android.sample.buttons.ButtonIntentService"
            android:label="@string/lbl_button_service"
            android:exported="true">
            <intent-filter>
                <action android:name="com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON"/>
            </intent-filter>
        </service>
  

----更新04.08 ----

仅供参考。我还尝试使用APPBUTTONBroadcastReceiver获取活动,让它启动IntentService但没有任何成功。以下是添加的代码片段:

[BroadcastReceiver]
    [IntentFilter(new[] { "com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON" }, Priority = (int)IntentFilterPriority.HighPriority)]
    class ButtonReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            var serviceIntent = new Intent(context, typeof(ButtonIntentService));
            serviceIntent.PutExtras(intent);
            context.StartService(serviceIntent);
        }
    }

AndroidManifest的片段:

<receiver android:name="ButtonReceiver">
        <intent-filter>
            <action android:name="com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON"/>
        </intent-filter>
    </receiver>

1 个答案:

答案 0 :(得分:0)

我现在得到了解决这个问题的方法。

您必须检查是否可以控制设备按钮。如果没有,您必须通过菜单为按钮选择IntentService。选择您的应用程序后,该服务将起作用。 这个简单的Check将处理IntentService

的问题
if (!AppButtonManager.HasButtonControl)
                {
                    Intent reconfigureApp = new Intent(Intent.ActionMain);
                    reconfigureApp.AddCategory(Intent.CategoryLauncher);
                    reconfigureApp.SetFlags(ActivityFlags.NewTask);
                    reconfigureApp.SetComponent(new ComponentName("com.panasonic.toughpad.android.service",
                                                              "com.panasonic.toughpad.android.appbuttondelegator.ConfigActivity"));
                    activity.StartActivity(reconfigureApp);
                }

此解决方案不需要Broadcast-Service。 IntentService就足够了。