我的应用程序托管用户安装的小部件,与启动器应用程序相同.
一旦我绑定小部件,一切正常.窗口小部件创建,自动更新,我可以单击以导航内部视图.
一切都工作正常,直到我从Play商店更新我的应用程序(或手动使用签名的APK).
更新后,小部件仍然显示但不再更新.一些小部件在我点击它们时起作用,但是视图被卡住并且永远不会更新,直到我重新创建小部件(获取新ID并绑定它).
我尝试使用强制更新
Intent intent = new Intent();
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.setComponent(appWidgetInfo.provider);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]
{appWidgetId});
context.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
但这没有帮助......
我想尝试点击强制更新,但我找不到任何方法来获取小部件的RemoteViews(因为这不是我的小部件,我只是托管它).
RemoteViews views =
new RemoteViews(context.getPackageName(),R.layout.mywidget_layout);
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(myWidgetProvider.WIDGET_IDS_KEY, ids);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, 0, updateIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.view_container, pendingIntent);
Run Code Online (Sandbox Code Playgroud)
还实现了一个AppWidgetProvider监听小部件的ID更改(APPWIDGET_HOST_RESTORED),但它不会在我的应用程序更新时调用.
我的下一步是在应用程序更新后重新创建所有小部件,但我真的不愿意这样做.
非常感谢任何帮助!
学习小部件3天后,我终于了解了setOnClickPendingIntent,RemoteViews ......我已经完成了我的小部件.它已经在很多教程的帮助下完成了.但现在我想测试它是否有效.在我读到的时候,最低更新率是30分钟.另一种方法是使用AlarmManager.但是我找不到AlarmManager的任何例子.等了30分钟后,什么也没发生.我改变了一些东西,还在等待,它改变了......
有没有办法更快地测试它?
<?xml version="1.0" encoding="utf-8" ?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="65dip"
android:minHeight="30dip"
android:updatePeriodMillis="180000"
android:initialLayout="@layout/main" />
Run Code Online (Sandbox Code Playgroud)
CountWidget
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
public class CountWidget extends AppWidgetProvider {
private static final int[] IMAGES = { R.drawable.die_1, R.drawable.die_2,
R.drawable.die_3, R.drawable.die_4, R.drawable.die_5,
R.drawable.die_6 };
public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";
public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
ComponentName me = new ComponentName(context, CountWidget.class);
appWidgetManager
.updateAppWidget(me, buildUpdate(context, …Run Code Online (Sandbox Code Playgroud) 我有一个appwidget,我正试图从一个活动更新.
为此,我需要appwidget id.
我已经使用AppWidgetManager.getAppWidgetIds但它总是返回一个空列表.
我也常常AppWidgetManager.getInstalledProviders确保我的ComponentName是正确的,但我仍然得到一个空列表.
我已经看到了关于这一切的所有其他问题,但我找不到对我有用的东西.
还有另一种解决方法吗?或者其他更新小部件的方法?
我的代码:
ComponentName name = new ComponentName(packageName, boardcastReceiverClass);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
int[] ids = appWidgetManager.getAppWidgetIds(name);
if (ids != null && ids.length > 0) {
getApplicationContext().sendBroadcast(getUpdateIntent(ids[0]));
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
更新:我应该提到我的AppWidgetProvider是在一个库项目中.根据我得到的ComponentName getInstalledProviders,我使用了我的应用程序的包名称和类名以及库的包名称.
我创建了一个简单的广播接收器,它工作得很好,除非我打开/关闭空中飞机模式,使用onReceive方法接收广播消息需要将近2分钟.另一件事是,如果我们启动应用程序然后如果我更改Air plane模式(开/关),则会导致问题,然后接收消息需要很长时间.
如果在启动应用程序之前有模式更改,则不会影响在onReceive方法中接收消息的时间.
源代码如下.
AndroidManifest.xml中
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.broadcastreceiver.BroadcastReceiverActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="MyBroadcastReceiver" >
<intent-filter>
<action android:name="test.intent.action.QR_CODE_RECEIVER" />
</intent-filter>
</receiver>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
BroadcastReceiverActivity.java
public class BroadcastReceiverActivity extends Activity {
public static String qrCodeReceiver = "test.intent.action.QR_CODE_RECEIVER";
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button broadcastBtn = (Button) findViewById(R.id.broadcastBtn);
broadcastBtn.setOnClickListener(new View.onClickListener(){
public void onClick(View v){
//TODO …Run Code Online (Sandbox Code Playgroud)