0

我有一个具有工作小部件的代码库。这个的基本结构是

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" />
4

1 回答 1

1

我能够传递一个标志并告诉它它是哪个小部件类,但这意味着我的父类(库 MyWidgetService)需要了解有关要更新的专业/免费类的详细信息。这打破了正确的面向对象模型。

不要传递标志,而是传递完全限定的类名,并使用反射来访问它。

或者,makeupdate()是一个实例方法,由onReceive(). 然后让服务发送匹配的广播。

于 2012-12-09T12:27:58.683 回答