android中可点击的小部件

开发者文档似乎在这里失败了。 我可以不考虑创build一个静态小部件,我甚至可以创build一个像模拟时钟小部件一样的小部件来更新自己,但是,我不能为我的生活弄清楚如何创build一个小部件,当用户点击它。 以下是开发人员文档给出的窗口小部件活动应该包含的最佳代码示例(唯一的提示是API演示,它只创​​build一个静态窗口小部件):

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); } } } 

来自: Android开发人员文档的小工具页面

所以,看起来像挂起意图被称为当小部件被点击,这是基于一个意图(我不太确定意图和挂起意图之间的区别是什么),意图是为ExampleActivity类。 所以我让我的示例活动类成为一个简单的活动,创build时会创build一个mediaplayer对象,并启动它(它永远不会释放对象,所以最终会崩溃,这是它的代码:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound); mp.start(); } 

但是,当我将这个小部件添加到主屏幕上,并且点击它时,没有任何玩法,实际上,当我将更新定时器设置为几百毫秒(在appwidget提供程序xml文件中)时,没有任何玩法。 此外,我设定了一个断点,发现它不仅没有达到活动的目的,而且也没有任何突破点能够触发。 (我仍然没有想出为什么),但是,logcat似乎表明活动类文件正在运行。

那么,有什么我可以做一个appwidget响应点击吗? 由于onClickPendingIntent()方法是最接近我findonClicktypes的方法。

非常感谢你。

首先,添加一个常量的静态variables。

 public static String YOUR_AWESOME_ACTION = "YourAwesomeAction"; 

然后,在将意图添加到挂起的意图之前,您需要将该操作添加到意图中:

 Intent intent = new Intent(context, widget.class); intent.setAction(YOUR_AWESOME_ACTION); 

(其中widget.class是你的AppWidgetProvider的类,你当前的类)

然后您需要使用getBroadcast创build一个PendingIntent

 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

在您的小部件中设置可点击视图的onClickPendingIntent

 remoteView.setOnClickPendingIntent(R.id.widgetFrameLayout, pendingIntent); 

接下来,重写同一个类中的onReceive方法:

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

然后通过在onReceive方法中查询返回的行为意图来响应button按下操作:

 if (intent.getAction().equals(YOUR_AWESOME_ACTION)) { //do some really cool stuff here } 

这应该做到这一点!