2017-03-03 175 views
0

我正在做widget开发的第一次。所以请耐心等待。我有一个Android服务,从onStart()开始部件。所以我在我的WidgetProvideronUpdate()和更新像按钮的意见。 现在我的问题是 -Android主屏幕小部件

1)我如何处理小工具按钮的按下,并告诉服务有关按钮按下,以便服务完成其工作?

2)服务完成后,它需要更新小部件按钮,我该如何处理?

3)当应用程序被杀害时,服务也被杀死。所以当我点击小部件时,如何确定该应用程序已被杀死并打开应用程序?

4)如果应用程序中的用户界面正在与服务对话并接收服务响应,我该如何将这些响应告诉小部件?

我的小部件代码是这样的 -

public class MyWidgetProvider extends AppWidgetProvider { 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
         int[] appWidgetIds) { 

     RemoteViews remoteViews; 
     ComponentName componentName; 

     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     componentName = new ComponentName(context, MyWidgetProvider.class); 

     remoteViews.setOnClickPendingIntent(R.id.button1,getPendingSelfIntent(context, "Play",componentName)); 
     remoteViews.setOnClickPendingIntent(R.id.button2,getPendingSelfIntent(context, "Pause",componentName)); 

     appWidgetManager.updateAppWidget(componentName, remoteViews); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     super.onReceive(context, intent); 

     if ("Play".equals(intent.getAction())) { 

     //I really dont know what to do here.... 

      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

      RemoteViews remoteViews; 
      ComponentName watchWidget; 

      remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
      watchWidget = new ComponentName(context, MyWidgetProvider.class); 



      appWidgetManager.updateAppWidget(watchWidget, remoteViews); 

     } 
    } 

    protected PendingIntent getPendingSelfIntent(Context context, String action, ComponentName componentName) { 
     Intent intent = new Intent(context, MyService.class); 
     intent.setAction(action); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, componentName); 
     return PendingIntent.getService(context, 0, intent, 0); 
    } 
} 

请你,请帮我在这

回答

1

1)你已经这样做,以你的getPendingSelfIntent()方法。虽然你的目标应该是MyWidgetProvider这样的:

Intent intent = new Intent(context, MyWidgetProvider.class); 

然后在你的onReceive你会检查是否意图动作是从那里“播放”,并启动服务:

Intent serviceIntent = new Intent(context, MyService.class); 

2)为了您的服务传达给你的widget,你需要发送一个广播:

Intent widgetUpdateIntent = new Intent(this, MyWidgetProvider.class); 
widgetUpdateIntent.setAction(ApplicationEvents.DATA_FETCHED);//this is your custom action 
widgetUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
sendBroadcast(widgetUpdateIntent); 

3)你并不需要显式打开应用程序(你不能这样做,实际上),如果你^ h如果您的更新周期设置为30分钟,您将收到onUpdate回拨,并且您也需要从那里启动您的服务。

4)当动作与您的自定义动作(ApplicationEvents.DATA_FETCHED)匹配时,您将更新onReceive事件中的用户界面。

+0

谢谢你的回答:)在第三点,我实际上有我的android:updatePeriodMillis =“1000” 在xml文件。但我见过Spotify,其中当应用程序被杀害,并且您点击小部件时,他们明确地打开该应用程序。 – MagdHo0506

+0

请注意,最小值为30分钟,如[文档](https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo.html#updatePeriodMillis)所述。为了使用较低的值,您需要使用AlarmManager。关于Spotify,当您点击小部件是一种不同的情况,因为小部件提供程序将处理意图,因此它与预定更新无关。 –

+0

是的,我也需要类似Spotify。我不需要预定的更新。我该怎么做呢? – MagdHo0506