我如何在AppWidget中运行方法?

时间:2014-12-17 05:09:34

标签: android android-appwidget

我今天学到了如何开发AppWidget,我的问题是,如何在app小部件中运行方法? 例: 我在xml中有一个按钮,我希望按钮计算一些东西。 - 创建小部件的部分工作正常,现在我想添加一些方法到按钮。 它是如何在" App Widgets"?

中运作的

这是我的代码:

public class WorkClockWidget extends AppWidgetProvider {

    MySharedPreferences shared;
    RemoteViews views;
    private Context context;
    private String text;

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

        for (int i = 0; i < appWidgetIds.length; i++) {

             views = new RemoteViews(context.getPackageName(), R.layout.clock_widget);

             /// i have button in the "R.layout.clock_widget" .
             //what i need to do if i want the button run the  "someText()" method?


            appWidgetManager.updateAppWidget(appWidgetIds[i], views);

        }
    }


    //The method i want to run when i press on the button.
    public String someText(){
        System.out.println("Works!!!");
        return "Test if this method works";
    }



}

还有一个问题: 如果我希望我的小部件将数据添加到我的数据库,我必须使用contentProvider?

1 个答案:

答案 0 :(得分:0)

您无法直接调用方法,但可以触发Intent。一种方法是使用PendingIntent.getBroadcast让Intent发送广播。 (我不确定你是否需要这个类别,但这就是我在自己的代码中如何做到这一点,所以我在这个例子中包括它。)

Intent intent = new Intent("com.myapp.button_press").addCategory("com.myapp");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.widget_button, pendingIntent);

接下来,您需要BroadcastReceiver才能接收该广播。一个偷偷摸摸的方法是使用你的AppWidgetProvider类作为接收器,因为那是一个app小部件。您必须修改应用小部件的清单条目,以包含您在onUpdate中创建的Intent:

<receiver android:name=".widget.MintAppWidgetProvider">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
        <action android:name="com.myapp.button_press"/>
        <category android:name="com.myapp"/>
    </intent-filter>

    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/my_provider_info"/>
</receiver>

此外,当你覆盖onReceive时,如果Intent不是你的特殊Intent,请务必调用super.onReceive,以便基本AppWidgetProvider类可以处理正常意图并调用onUpdate。

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    if ("com.myapp.button_press".equals(action)) {
        // First handle your special intent action
        someText();
    } else {
        // otherwise let Android call onUpdate
        super.onReceive(context, intent);
    }
}