如何从Android AppWidget启动Activity?

13

这样的代码效果很好。

    Intent configIntent = new Intent (context, WidgetConfigActivity.class);
    configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    PendingIntent pIntent = PendingIntent.getActivity(context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    remoteView.setOnClickPendingIntent(R.id.btn, pIntent);

我想在活动出现之前隐藏按钮,因此我试图将意图发送到小部件本身,在onReceive()方法中执行隐藏组件,然后启动活动。问题是我不能在AppWidget中使用startActivity()函数。

有没有解决办法?

4个回答

19

问题在于我不能在AppWidget中使用startActivity()函数。

实际上可以。在你的AppWidgetProvideronUpdate()(或onReceive())方法中,你会传入一个Context对象--在该对象上调用startActivity()即可。


2
没有什么比在周五下午听到一份好的CommonsWare答案更让人愉悦了...直戳问题本质。 - Alex Lockwood
哦我的天啊,我知道这是StackOverflow,但我必须说:我花了整个周末来制作一个类,以便从活动中获取上下文到小部件,只因为我没有注意到在onUpdate中传递的上下文,哦亲爱的上帝。 - Motassem Kassab

16

感谢CommonsWare。

还有一件事要做。context.startActivity();在这种情况下会抛出一个RuntimeException

从Activity上下文之外调用startActivity()需要使用FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?

所以你需要设置标志。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

之前。


6
   // on receive function use this for new activity start
               Intent intent = new Intent (context, AppWdget.class);
               intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
               context.startActivity (intent);

0

你可以发送广播意图而不是启动一个活动!我想在小部件按钮被按下时执行一个操作,而不是特别地启动一个会显示在屏幕上的活动。你可以使用这种技术在小部件本身中执行代码(其中小部件不一定包含一个活动)。

Intent intt = new Intent(ctx, RWidg.class);
intt.setAction("myActionName");
PendingIntent bcInt = PendingIntent.getBroadcast(ctx, 0, intt, 0);

RemoteViews views = new RemoteViews(ctx.getPackageName(), R.layout.widg_lay);
views.setOnClickPendingIntent(R.id.button, bcInt);

appWidgetManager.updateAppWidget(widgId, views);

与其使用PendingIntent来启动一个活动,使用PendingIntent.getBroadcast()创建一个带有“秘密密钥”的PendingIntent:ActivityManager.INTENT_SENDER_BROADCAST,这会导致ActivityManager执行sendBroadcast()而不是startActivity()。
您需要在onRecieve()方法中添加一个“if”语句来拦截您使用的操作名称或名称。
public void onReceive(Context ctx, Intent intt) {
  String action = intt.getAction();
  if (action.compareTo("myActionName")) {
    // Do your myActionName work here
  } else {
    super.onReceive(ctx, intt);
  }
} // end of onReceive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接