我正在为我的应用程序开发一个小部件,我想将特定数据从小部件传递到应用程序。用户可以添加多个版本的小部件,我需要检测它来自哪个小部件,以便我可以在应用程序中显示特定信息。
到目前为止我的工作是什么,但只有当我完全退出我的应用程序时(反复按下后退按钮),否则它似乎没有检测到传入的数据。
这个代码我必须将数据从小部件传递到应用程序:
public class WidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i=0; i<N; i++)
UpdateWidget(context, appWidgetManager, appWidgetIds[i]);
}
public static void UpdateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
{
Intent intent = new Intent(context, Main.class);
final Bundle bun = new Bundle();
bun.putInt("widgetId", appWidgetId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtras(bun);
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setOnClickPendingIntent(R.id.widgetText, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
更新
感谢Tal Kanel,让这个工作得以实现。我的应用中有ActionBar
并遵循Google的指南,我在onOptionsItemSelected
中有此代码:
if (item.getItemId() == android.R.id.home) {
final Intent intent = new Intent(activity, Main.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return true;
}
如果我点击ActionBar
中的“后退”按钮,然后最小化我的应用并点击小部件,此代码始终为空:
if (getIntent().getExtras() != null)
{
}
更新2
实际上,回到我的应用中的主要活动会导致getExtras()
为空。我在我的应用小部件中有这个代码,它不会将任何额外内容传递给应用程序:
PendingIntent piMain = PendingIntent.getActivity(context, appWidgetId, new Intent(context, Main.class), PendingIntent.FLAG_UPDATE_CURRENT);
rv.setOnClickPendingIntent(R.id.widgetTitle, piMain);
如果我在我的小部件中单击该部分,然后返回并单击我的小部件中应该传递额外内容的部分,getExtras()
始终为空。
答案 0 :(得分:10)
首先 - 当您按下直到返回主屏幕时,您的应用程序并未真正关闭。只是在这个阶段没有来自你的应用程序的任何活动 我认为,如果你不这样做,那就非常重要了......
关于你的问题:
您正尝试使用FLAG_ACTIVITY_CLEAR_TOP从小部件启动活动,它定义为:
如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在在最前面)作为新意图的旧活动。
这意味着如果您的Main活动已经在forground中运行,那么当您从窗口小部件启动活动时 - 此Main活动之上的所有其他活动将从堆栈中删除,Main将恢复并进入 Activity.onNewIntent(intent)回调。
这就是你没有看到数据的原因 - 因为活动没有使用新意图重新启动,而是只使用你发送的新意图进入onNewIntent(intent)。
我敢肯定,如果你在onNewIntent(intent)方法中设置一个断点 - 你会看到你发送的意图是在那里传递的,带有所有额外的数据。
您的代码的另一个问题:检查Intent.putExtras(boundle)方法的定义:
向intent添加一组扩展数据。键必须包含包前缀,例如app com.android.contacts将使用“com.android.contacts.ShowAll”这样的名称。
您似乎没有根据规则调用您的密钥前缀。这就是为什么它是空的。
希望它对你有所帮助。