在小部件中单击按钮后服务未启动
Posted
技术标签:
【中文标题】在小部件中单击按钮后服务未启动【英文标题】:Service doesn't start after button click in widget 【发布时间】:2015-07-19 03:22:48 【问题描述】:单击小部件中的按钮后,我正在尝试启动服务,但不知何故该服务无法启动。我在整个互联网上寻找并没有找到答案。
这是 onUpdate 方法
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
// Create an intent to launch the service
Intent serviceIntent = new Intent(context, MyService.class);
// PendingIntent is required for the onClickPendingIntent that actually
// starts the service from a button click
PendingIntent pendingServiceIntent =
PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// Get the layout for the App Widget and attach a click listener to the
// button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.meat);
appWidgetManager.updateAppWidget(appWidgetIds, views);
Log.i(TAG, "onUpdate is on");
views.setOnClickPendingIntent(R.id.button, pendingServiceIntent);
context.startService(serviceIntent);
super.onUpdate(context, appWidgetManager, appWidgetIds);
我也试过onRecive方法
@Override
public void onReceive(Context context, Intent intent)
Intent intent1 = new Intent (context, MyService.class);
intent1.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService (intent1);
super.onReceive(context, intent);
我尝试通过 toast 消息对其进行测试
public class MyService extends Service
Context context = getApplicationContext();
@Override
public void onCreate()
Toast.makeText(context, "the service started", Toast.LENGTH_SHORT).show();
这是 onStartCommand
@Override
public int onStartCommand(Intent intent, int flags, int startId)
timer = new MyCounter(21600000,1000);
RemoteViews v = new RemoteViews(getPackageName(),R.layout.meat);
v.setTextViewText(R.id.textView2, getCurrentTime());
appWidgetManager.updateAppWidget(thisWidget, v);
timer.start();
Toast.makeText(context, "the service started", Toast.LENGTH_SHORT).show();
appWidgetManager.updateAppWidget(thisWidget, v);
return START_STICKY;
我的清单
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".meat" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/meat_info" />
</receiver>
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="ACTION_WIDGET_CLICK_RECEIVER"/>
</intent-filter>
</service>
</application>
【问题讨论】:
【参考方案1】:要启动服务,您必须在 onReceive 中调用startService 方法。所以只需替换这一行:
context.startActivity (intent1);
有了这个:
context.startService(intent1);
并且一定要覆盖 onStartCommand 启动服务的方法
【讨论】:
谢谢,但我已经尝试过了,但它不起作用。你还有什么想法吗? @user4811620 您是否尝试在 onUpdate 和 onReceive 方法中添加断点,只是为了检查它们是否被调用?并且还尝试在服务中添加断点。说清楚一点,不显示 Toast 并不代表你的服务没有启动,Service 不打算与 UI 交互 我在调试模式下进行了检查,没有调用 onUpdate 和 onReceive。你知道为什么吗? 您能说明如何为这些回调指定侦听器吗?至于 onReceive - 我想你正在使用 BroadcastReceiver - 在这种情况下,你能告诉我你如何注册它以及如何发送广播 我想在不使用 BroadcastReceiver 的情况下执行此操作(因为我希望它以 1 分钟的间隔更新)。没有它我已经成功了,但我不记得怎么做了。以上是关于在小部件中单击按钮后服务未启动的主要内容,如果未能解决你的问题,请参考以下文章