这样的代码效果很好。
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()
函数。
有没有解决方案?
答案 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