android – 在Appwidget中的一个视图中使用两个pendingIntent

我有一个小部件类(扩展appwidgetprovider),它在窗口小部件的布局中只有一个视图( ImageView).当用户点击窗口小部件时,它会更新并启动没有问题的活动.此外,小部件每30分钟更新一次,并在小部件更新后启动活动.我的问题是:
如何自动更新窗口小部件才能自动更新(不是通过用户点击)?

这是我的代码

public class Widget extends appwidgetprovider {

private static final String ACTION_UPDATE = AppWidgetManager.ACTION_APPWIDGET_UPDATE;

@Override
public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) {
    ComponentName cn = new ComponentName(context,Widget.class);
    appWidgetManager.updateAppWidget(cn,remoteView(context));
}

@Override
public void onReceive(Context context,Intent intent) {
    super.onReceive(context,intent);
    if (intent.getAction().equalsIgnoreCase(ACTION_UPDATE)) {
        ComponentName cn = new ComponentName(context,Widget.class);
        AppWidgetManager.getInstance(context).updateAppWidget(cn,remoteView(context));
        Intent launch = new Intent(context,Main.class);
        PendingIntent pi = PendingIntent.getActivity(context,launch,0);
        try {
            pi.send();
        } catch (CanceledException e) {
            e.printstacktrace();
        }
    }
}

private RemoteViews remoteView(Context ctx) {
    ArrayList<Integer> imageId = new ArrayList<Integer>();
    for (int i = 1; i <= 30; i++) {
        int drawableImageId = ctx.getResources().getIdentifier("image" + i,"drawable",ctx.getPackageName());
        imageId.add(drawableImageId);
    }

    RemoteViews rv = new RemoteViews(ctx.getPackageName(),R.layout.widget);

    Calendar todayDate = Calendar.getInstance();
    todayDate.setTimeInMillis(System.currentTimeMillis());

    Calendar startDate = Calendar.getInstance();
    startDate.set(2014,05,15);

    int dayDiffer = Helper.getDiffernce(todayDate,startDate);
    dayDiffer += 1;

    if (dayDiffer >= 1 && dayDiffer <= 30) {
        rv.setInt(R.id.img_widget,"setimageResource",imageId.get(dayDiffer - 1));
        T(ctx,"in  >> " + dayDiffer);
    } else if (dayDiffer >= 0) {
        T(ctx,"before  >> " + dayDiffer);
    } else if (dayDiffer <= 31) {
        T(ctx,"after  >> " + dayDiffer);
    }

    Intent update = new Intent(ctx,Widget.class);
    update.setAction(ACTION_UPDATE);
    PendingIntent pi_update = PendingIntent.getbroadcast(ctx,update,0);
    rv.setonClickPendingIntent(R.id.img_widget,pi_update);

    return rv;
}

public void T(Context context,String string) {
    Toast.makeText(context,string,Toast.LENGTH_SHORT).show();
}

}

解决方法

更改您的“remoteView()”方法中的PendingIntent:
Intent userInput = new Intent(ctx,Widget.class);
userInput.setAction("LAUNCH_MAIN_ACTIVITY");    // use another action!

PendingIntent pi_userInput = 
                   PendingIntent.getbroadcast(ctx,userInput,0);
rv.setonClickPendingIntent(R.id.img_widget,pi_userInput);

您的新“onReceive()”方法可能如下所示:

@Override
public void onReceive(Context context,intent);

    if (intent.getAction().equalsIgnoreCase(ACTION_UPDATE)) {
        ComponentName cn = new ComponentName(context,remoteView(context));

    }

    // the launch will always be executed,// the update only for "ACTION_UPDATE" 
    Intent launch = new Intent(context,Main.class);
    PendingIntent pi = PendingIntent.getActivity(context,0);
    try {
        pi.send();
    } catch (CanceledException e) {
        e.printstacktrace();
    }
}

希望这可以帮助!

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...