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()方法中执行隐藏组件,然后启动活动。问题是我不能startActivity()在 AppWidget 中使用函数。

有什么解决办法吗?

4

4 回答 4

19

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

是的你可以。您被传入(或)您的-- 调用的Context对象中。onUpdate()onReceive()AppWidgetProviderstartActivity()

于 2012-06-29T22:58:29.457 回答
16

谢谢 2 CommonsWare

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

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

所以你需要设置标志

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

前。

于 2012-06-30T09:14:49.297 回答
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);
于 2015-05-12T11:11:12.343 回答
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
于 2021-06-14T00:04:47.500 回答