在小部件中单击按钮后服务未启动

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 分钟的间隔更新)。没有它我已经成功了,但我不记得怎么做了。

以上是关于在小部件中单击按钮后服务未启动的主要内容,如果未能解决你的问题,请参考以下文章

在小部件树中检测到重复的 GlobalKey

单击android小部件按钮上的侦听器

小部件 setOnClickPendingIntent 未启动服务

如何在android小部件中单击图像按钮显示吐司

单击按钮后如何通过服务执行小部件更新?

小部件未出现在小部件列表中