我正在实现一个带有集合的小部件。我的小部件工作正常,但是,当用户点击集合中的某个项目时,我想从小部件打开我的应用程序的通行证和ID,到Main
activity
,然后,将用户重定向到另一个activity
。我这样做的原因是我需要先刷新Main
活动(我显示未读项目的数量)。
我第一次点击窗口小部件集合中的项目时,我的工作原理是什么。但是,如果我按下主页按钮并单击另一个项目,我的应用程序只会显示Browser
活动的最后一个屏幕(用户指向的第二个活动)。如果我退出应用程序或单击返回,然后转到窗口小部件,它按预期工作。这个问题只发生在我“最小化”应用时,同时保留在第二个activity
。
我不确定它是否与小部件服务中的PendingIntent
有关。
小工具服务
public class WidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
}
}
class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private List<Integer> mIds = new ArrayList<Integer>();
private Context mContext;
private int mAppWidgetId;
public StackRemoteViewsFactory(Context context, Intent intent) {
mContext = context;
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
}
public void onCreate() {
}
public int getCount() {
// TODO Auto-generated method stub
return mIds.size();
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public RemoteViews getLoadingView() {
// TODO Auto-generated method stub
return null;
}
public RemoteViews getViewAt(int position) {
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
final Intent mi = new Intent(mContext, Main.class);
final Bundle bun = new Bundle();
bun.putInt("id", mIds.get(position));
mi.putExtras(bun);
final PendingIntent piMain = PendingIntent.getActivity(mContext, position, mi, PendingIntent.FLAG_UPDATE_CURRENT);
rv.setOnClickPendingIntent(R.id.widget_text, piMain);
rv.setTextViewText(R.id.widget_text, mIds.get(position));
return rv;
}
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 1;
}
public boolean hasStableIds() {
// TODO Auto-generated method stub
return true;
}
public void onDataSetChanged() {
mIds = Utilities.GetIds(); //returns id's from a sqlite database
}
public void onDestroy() {
// TODO Auto-generated method stub
}
}
Main.class
public class Main extends SherlockFragmentActivity
{
@Override
public void onCreate(final Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
}
public void onNewIntent(Intent intent){
final Bundle extras = intent.getExtras();
final Intent browser = new Intent(this, Browser.class);
final Bundle bun = new Bundle();
bun.putInt("id", extras.getInt("id"));
browser.putExtras(bun);
startActivity(browser);
}
}
Browser.class
public class BrowserPager extends SherlockFragmentActivity
{
private int mId = 0;
@Override
public void onCreate(final Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.browser_pager);
final Bundle extras = getIntent().getExtras();
if (extras != null)
{
mId = extras.getInt("id");
}
...
}
}
答案 0 :(得分:1)
请重读有关小部件集合的部分: http://developer.android.com/guide/topics/appwidgets/index.html#collections
http://developer.android.com/reference/android/widget/RemoteViews.html#setOnClickPendingIntent(int,android.app.PendingIntent)声明:
设置集合中项目的点击操作时(例如, ListView,StackView等),这种方法不起作用。相反,使用 {@link RemoteViews#setPendingIntentTemplate(int,PendingIntent)in 与RemoteViews结合#setOnClickFillInIntent(int,Intent)。
要在窗口小部件中使用集合,请创建一个Intent来调用您的活动。该意图被添加到使用setPendingIntentTemplate添加到集合视图(列表,堆栈,网格)的PendingIntent中。这一切都发生在AppWidgetProvider类的onUpdate方法中。 要将单个行为添加到单个项目,您需要创建另一个包含有关该单个项目的额外内容的Intent,并使用setOnClickFillInIntent将其添加到getViewAt中的RemoteViews。接收活动可以通常的方式读取额外的参数。
整个PendingIntent代码进入AppWidgetProvider,例如像这样:
final Intent mi = new Intent(mContext, Main.class)
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
final PendingIntent piMain = PendingIntent.getActivity(mContext, position, mi, PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.MyCollection, piMain);
你的getViewAt代码看起来更像是这样:
final Intent fillInIntent = new Intent();
final Bundle bun = new Bundle();
bun.putInt("id", mIds.get(position));
fillInIntent.putExtras(bun);
rv.setOnClickFillInIntent(R.id.widget_text, fillInIntent);