Xamarin IntentService 由 HardwareButton 启动
Xamarin IntentService started by HardwareButton
我试了好几天才得到这个 运行,但没有成功。
我正在尝试通过其特定 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 的代码片段。
安卓清单:
<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>
我是这个 API 连接事物的新手。在我看来,Intent 现在应该通过过滤器在 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>
----UPDATE 04.08----
仅供参考。我还尝试使用 BroadcastReceiver
从 APPBUTTON
获取事件并让它启动 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>
我现在找到了这个问题的解决方案。
您必须检查您是否拥有设备按钮的控制权。如果没有,您必须通过菜单为按钮选择 IntentService
。选择您的应用程序后,该服务将运行。
这个简单的检查将处理 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);
}
此解决方案不需要广播服务。 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 的代码片段。 安卓清单:
<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>
我是这个 API 连接事物的新手。在我看来,Intent 现在应该通过过滤器在 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>
----UPDATE 04.08----
仅供参考。我还尝试使用 BroadcastReceiver
从 APPBUTTON
获取事件并让它启动 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>
我现在找到了这个问题的解决方案。
您必须检查您是否拥有设备按钮的控制权。如果没有,您必须通过菜单为按钮选择 IntentService
。选择您的应用程序后,该服务将运行。
这个简单的检查将处理 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);
}
此解决方案不需要广播服务。 IntentService 本身就足够了。