我有一个具有工作小部件的代码库。这个的基本结构是
MyAppWidget extends AppWidgetProvider
MyWidgetService extends IntentService
MyWidgetService
更新MyAppWidget
并且一切都很好,直到我决定将我的应用程序变成一个库以从相同的代码库创建一个“免费/专业”组合。现在我有这样的东西
com.example.myapp.free.MyAppWidget extends com.example.myapp.library.MyAppWidget
com.example.myapp.pro.MyAppWidget extends com.example.myapp.library.MyAppWidget
com.example.myapp.library.MyAppWidget extends AppWidgetProvider
com.example.myapp.library.MyWidgetService extends IntentService
MyWidgetService
运行MyAppWidget.update()方法以更新显示。
在这种情况下,小部件会根据应用程序的版本进行微调,一切正常,但MyWidgetService
不会更新小部件。
我已经验证它MyWidgetService
实际上按计划运行,但它不知道要调用什么更新方法。就目前而言,MyWidgetService
将调用com.example.myapp.library.MyAppWidget.update()而不是专业版或免费版。
我能够传递一个标志并告诉它它是哪个小部件类,但这意味着我的父类(库MyWidgetService
)需要了解有关要更新的专业/免费类的详细信息。这打破了正确的面向对象模型。
我的问题是,传达应该更新哪个小部件类的正确方法是什么?
由于这是一件很难解释的事情,下面是我的课程的一些骨架细节,以防它有助于解释事情。
任何帮助表示赞赏。
图书馆 MyWidgetService
public class MyWidgetService extends IntentService {
public MyWidgetService() {
super(MyWidgetService.class.getSimpleName());
}
@Override
protected void onHandleIntent(Intent intent) {
// this calls the update method of the widget
// but it doesn't know which object to call
MyAppWidget.update();
scheduleNextUpdate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
private void scheduleNextUpdate() {
// schedule next time for the service to work
}
}
库 MyAppWidget
public class MyAppWidget extends AppWidgetProvider {
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Intent intent = new Intent(context, MyWidgetService.class);
context.startService(intent);
}
public static void update() {
// update widget display
}
}
扩展库 MyAppWidget 的免费 MyAppWidget
public class MyAppWidget extends com.example.myapp.library.MyAppWidget {
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
// setup free widget
// what can I do here to pass down to the service
// to make sure it updates this widget class
}
}
免费应用清单
<!-- use the extended widget from com.example.myapp.free -->
<receiver
android:name=".MyWidgetApp"
android:label="@string/clock_widget_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/clock_widget" />
</receiver>
<!-- use the service from the library project -->
<service android:name="com.example.myapp.library.MyWidgetService" />