开发文档在这里似乎对我失灵了。 我可以轻松创建静态小部件,甚至可以创建像模拟时钟小部件这样的自更新小部件,但是我死活想不出如何创建响应用户单击的小部件。以下是开发文档提供的有关小部件活动应包含什么的最佳代码示例(唯一的其他提示是API演示,它仅创建静态小部件):
public class ExampleAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current App Widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
所以,看起来当小部件被点击时会调用挂起意图(pending intent),这是基于一个意图(intent)(我不太确定意图和挂起意图的区别),而该意图是为ExampleActivity类创建的。所以我创建了一个简单的活动类作为示例,在创建时会创建一个媒体播放器对象并启动它(它不会释放该对象,因此最终会崩溃,以下是它的代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
mp.start();
}
然而,当我把小部件添加到主屏幕并点击它时,什么也没有播放,甚至当我将更新定时器设置为几百毫秒时(在appwidget提供程序xml文件中),仍然没有任何声音。此外,我设置了断点并发现不仅从未到达活动,而且我设置的任何断点都不会被触发。(我仍然没有弄清楚为什么),但是logcat似乎表明正在运行活动类文件。
那么,有什么可以使appwidget响应点击的方法吗?因为onClickPendingIntent()
方法是我找到的最接近onClick
类型的方法。