如何从Android AppWidget启动Activity?

时间:2012-06-29 22:07:12

标签: android android-activity android-appwidget

这样的代码效果很好。

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

但是我想要隐藏按钮befor活动会出现,所以我正在试图向窗口小部件本身发送意图,在onReceive()方法中执行隐藏组件然后开始活动。问题是我不能在AppWidget中使用startActivity()函数。

有没有解决方案?

4 个答案:

答案 0 :(得分:16)

  

问题是我无法在AppWidget中使用startActivity()函数。

是的,你可以。您将Context个对象传递到onUpdate()的{​​{1}}(或onReceive()) - AppWidgetProvider。{/ p>}。

答案 1 :(得分:14)

感谢2 CommonsWare

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

  

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

所以你需要设置标志

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

之前。

答案 2 :(得分:5)

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

答案 3 :(得分: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