0

我正在实现一个带有集合的小部件。我的小部件工作正常,但是,当用户单击集合中的一个项目时,我想打开我的应用程序一个 pass 和 id,从小部件到Main activity,然后将用户重定向到另一个activity. 我这样做的原因是我需要先刷新Main活动(我显示未读项目的数量)。

第一次单击小部件集合中的项目时,我所拥有的功能。但是,如果我按下主页按钮并单击另一个项目,我的应用程序只会显示Browser活动的最后一个屏幕(用户被定向到的第二个活动)。如果我退出应用程序或单击返回,然后转到小部件,它会按预期工作。此问题仅在我“最小化”应用程序时发生,同时保留在 2nd 上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

    }
}

主类

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

浏览器类

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");
        }
        ...
    }
}
4

1 回答 1

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) 与 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);
于 2013-10-19T02:21:51.553 回答