重新启动 phone 时小部件不工作?
Widget doesn't work when reboot the phone?
我有一个运行良好的小部件。一切正常,除非我重新启动 phone。如果我重新启动 phone,小部件不会显示任何数据。我在这里搜索一些答案,但我发现的所有内容都不适合我。
有人可以看看我的代码并告诉我问题出在哪里吗??
提前致谢。
这是我的 class:
@Override
public void onReceive(Context context, Intent intent) {
if (intent.hasExtra(WIDGET_IDS_KEY_RIGHT)) {
int[] ids = intent.getExtras().getIntArray(WIDGET_IDS_KEY_RIGHT);
if (intent.hasExtra(WIDGET_DATA_KEY_RIGHT)) {
Object data = intent.getExtras().getParcelable(WIDGET_DATA_KEY_RIGHT);
this.update(context, AppWidgetManager.getInstance(context), ids, data);
} else {
this.onUpdate(context, AppWidgetManager.getInstance(context), ids);
}
} else super.onReceive(context, intent);
if (intent.hasExtra(WIDGET_IDS_KEY_LEFT)) {
int[] ids = intent.getExtras().getIntArray(WIDGET_IDS_KEY_LEFT);
if (intent.hasExtra(WIDGET_IDS_KEY_LEFT)) {
Object data = intent.getExtras().getParcelable(WIDGET_DATA_KEY_LEFT);
this.update(context, AppWidgetManager.getInstance(context), ids, data);
} else {
this.onUpdate(context, AppWidgetManager.getInstance(context), ids);
}
} else super.onReceive(context, intent);
if (intent.hasExtra(WIDGET_IDS_KEY_CENTRAL)) {
int[] ids = intent.getExtras().getIntArray(WIDGET_IDS_KEY_CENTRAL);
if (intent.hasExtra(WIDGET_IDS_KEY_CENTRAL)) {
Object data = intent.getExtras().getParcelable(WIDGET_DATA_KEY_CENTRAL);
this.update(context, AppWidgetManager.getInstance(context), ids, data);
} else {
this.onUpdate(context, AppWidgetManager.getInstance(context), ids);
}
} else super.onReceive(context, intent);
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
startWidgetUpdateService(context);
}
protected static void startWidgetUpdateService(Context context) {
Intent serviceIntent = new Intent(context, SimpleWidgetProvider.class);
context.startService(serviceIntent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
update(context, appWidgetManager, appWidgetIds, null);
}
public void update(Context context, AppWidgetManager manager, int[] ids, Object data) {
for (int appWidgetId : ids) {
preferences = PreferenceManager.getDefaultSharedPreferences(context);
numberRight = preferences.getString(HmApplication.PREF_NUMBER_RIGHT, "");
numberCentral = preferences.getString(HmApplication.PREF_NUMBER_CENTRAL, "");
numberLeft = preferences.getString(HmApplication.PREF_NUMBER_LEFT, "");
Intent callIntentRight = new Intent(Intent.ACTION_CALL);
callIntentRight.setData(Uri.parse("tel:" + numberRight));
Intent callIntentCentral = new Intent(Intent.ACTION_CALL);
callIntentCentral.setData(Uri.parse("tel:" + numberCentral));
Intent callIntentLeft = new Intent(Intent.ACTION_CALL);
callIntentLeft.setData(Uri.parse("tel:" + numberLeft));
PendingIntent pendingIntentRight = PendingIntent.getActivity(context, 0, callIntentRight, 0);
PendingIntent pendingIntentCentral = PendingIntent.getActivity(context, 0, callIntentCentral, 0);
PendingIntent pendingIntentLeft = PendingIntent.getActivity(context, 0, callIntentLeft, 0);
preferences = PreferenceManager.getDefaultSharedPreferences(context);
isCheckedOne = preferences.getBoolean(HmApplication.PREF_CHECKBOX_ONE, false);
isCheckedTwo = preferences.getBoolean(HmApplication.PREF_CHECKBOX_TWO, false);
isCheckedThree = preferences.getBoolean(HmApplication.PREF_CHECKBOX_THREE, false);
views = new RemoteViews(context.getPackageName(), R.layout.simple_widget);
if(isCheckedOne == true){
views = new RemoteViews(context.getPackageName(), R.layout.simple_widget_one);
views.setTextViewText(R.id.actionButtonLeft, Main.textNamePhoneLeft);
}
if(isCheckedTwo == true){
views = new RemoteViews(context.getPackageName(), R.layout.simple_widget_two);
views.setTextViewText(R.id.actionButtonLeft, Main.textNamePhoneLeft);
views.setTextViewText(R.id.actionButtonCentral, Main.textNamePhoneCentral);
}
views.setOnClickPendingIntent(R.id.actionButtonRight, pendingIntentRight);
views.setOnClickPendingIntent(R.id.actionButtonCentral, pendingIntentCentral);
views.setOnClickPendingIntent(R.id.actionButtonLeft, pendingIntentLeft);
views.setTextViewText(R.id.actionButtonLeft, Main.textNamePhoneLeft);
views.setTextViewText(R.id.actionButtonCentral, Main.textNamePhoneCentral);
views.setTextViewText(R.id.actionButtonRight, Main.textNamePhoneRight);
manager.updateAppWidget(appWidgetId, views);
}
}
public void updateMyWidgets(Context context) {
AppWidgetManager man = AppWidgetManager.getInstance(context);
int[] ids = man.getAppWidgetIds(new ComponentName(context, SimpleWidgetProvider.class));
preferences = PreferenceManager.getDefaultSharedPreferences(context);
numberRight = preferences.getString(HmApplication.PREF_NUMBER_RIGHT, "");
numberCentral = preferences.getString(HmApplication.PREF_NUMBER_CENTRAL, "");
numberLeft = preferences.getString(HmApplication.PREF_NUMBER_LEFT, "");
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_IDS_KEY_RIGHT, ids);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_DATA_KEY_RIGHT, numberRight);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_IDS_KEY_CENTRAL, ids);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_DATA_KEY_CENTRAL, numberCentral);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_IDS_KEY_LEFT, ids);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_DATA_KEY_LEFT, numberLeft);
context.sendBroadcast(updateIntent);
}
这是我的清单:
<receiver android:name=".SimpleWidgetProvider"
android:label="myWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/simple_widget_info" />
</receiver>
实施 android.intent.action.BOOT_COMPLETED
接收器和 onRecieve 方法调用您的方法 updateMyWidgets
以更新小部件
您需要在清单中使用操作名称 android.intent.action.BOOT_COMPLETED
.
定义接收器
<!-- Start the Service if applicable on boot -->
<receiver android:name="com.test.MyReceiver ">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
确保还包含完整的启动权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
现在实现接收器
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
YourClass.updateMyWidgets();// you may need to make this method static.
}
}
我有一个运行良好的小部件。一切正常,除非我重新启动 phone。如果我重新启动 phone,小部件不会显示任何数据。我在这里搜索一些答案,但我发现的所有内容都不适合我。
有人可以看看我的代码并告诉我问题出在哪里吗??
提前致谢。
这是我的 class:
@Override
public void onReceive(Context context, Intent intent) {
if (intent.hasExtra(WIDGET_IDS_KEY_RIGHT)) {
int[] ids = intent.getExtras().getIntArray(WIDGET_IDS_KEY_RIGHT);
if (intent.hasExtra(WIDGET_DATA_KEY_RIGHT)) {
Object data = intent.getExtras().getParcelable(WIDGET_DATA_KEY_RIGHT);
this.update(context, AppWidgetManager.getInstance(context), ids, data);
} else {
this.onUpdate(context, AppWidgetManager.getInstance(context), ids);
}
} else super.onReceive(context, intent);
if (intent.hasExtra(WIDGET_IDS_KEY_LEFT)) {
int[] ids = intent.getExtras().getIntArray(WIDGET_IDS_KEY_LEFT);
if (intent.hasExtra(WIDGET_IDS_KEY_LEFT)) {
Object data = intent.getExtras().getParcelable(WIDGET_DATA_KEY_LEFT);
this.update(context, AppWidgetManager.getInstance(context), ids, data);
} else {
this.onUpdate(context, AppWidgetManager.getInstance(context), ids);
}
} else super.onReceive(context, intent);
if (intent.hasExtra(WIDGET_IDS_KEY_CENTRAL)) {
int[] ids = intent.getExtras().getIntArray(WIDGET_IDS_KEY_CENTRAL);
if (intent.hasExtra(WIDGET_IDS_KEY_CENTRAL)) {
Object data = intent.getExtras().getParcelable(WIDGET_DATA_KEY_CENTRAL);
this.update(context, AppWidgetManager.getInstance(context), ids, data);
} else {
this.onUpdate(context, AppWidgetManager.getInstance(context), ids);
}
} else super.onReceive(context, intent);
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
startWidgetUpdateService(context);
}
protected static void startWidgetUpdateService(Context context) {
Intent serviceIntent = new Intent(context, SimpleWidgetProvider.class);
context.startService(serviceIntent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
update(context, appWidgetManager, appWidgetIds, null);
}
public void update(Context context, AppWidgetManager manager, int[] ids, Object data) {
for (int appWidgetId : ids) {
preferences = PreferenceManager.getDefaultSharedPreferences(context);
numberRight = preferences.getString(HmApplication.PREF_NUMBER_RIGHT, "");
numberCentral = preferences.getString(HmApplication.PREF_NUMBER_CENTRAL, "");
numberLeft = preferences.getString(HmApplication.PREF_NUMBER_LEFT, "");
Intent callIntentRight = new Intent(Intent.ACTION_CALL);
callIntentRight.setData(Uri.parse("tel:" + numberRight));
Intent callIntentCentral = new Intent(Intent.ACTION_CALL);
callIntentCentral.setData(Uri.parse("tel:" + numberCentral));
Intent callIntentLeft = new Intent(Intent.ACTION_CALL);
callIntentLeft.setData(Uri.parse("tel:" + numberLeft));
PendingIntent pendingIntentRight = PendingIntent.getActivity(context, 0, callIntentRight, 0);
PendingIntent pendingIntentCentral = PendingIntent.getActivity(context, 0, callIntentCentral, 0);
PendingIntent pendingIntentLeft = PendingIntent.getActivity(context, 0, callIntentLeft, 0);
preferences = PreferenceManager.getDefaultSharedPreferences(context);
isCheckedOne = preferences.getBoolean(HmApplication.PREF_CHECKBOX_ONE, false);
isCheckedTwo = preferences.getBoolean(HmApplication.PREF_CHECKBOX_TWO, false);
isCheckedThree = preferences.getBoolean(HmApplication.PREF_CHECKBOX_THREE, false);
views = new RemoteViews(context.getPackageName(), R.layout.simple_widget);
if(isCheckedOne == true){
views = new RemoteViews(context.getPackageName(), R.layout.simple_widget_one);
views.setTextViewText(R.id.actionButtonLeft, Main.textNamePhoneLeft);
}
if(isCheckedTwo == true){
views = new RemoteViews(context.getPackageName(), R.layout.simple_widget_two);
views.setTextViewText(R.id.actionButtonLeft, Main.textNamePhoneLeft);
views.setTextViewText(R.id.actionButtonCentral, Main.textNamePhoneCentral);
}
views.setOnClickPendingIntent(R.id.actionButtonRight, pendingIntentRight);
views.setOnClickPendingIntent(R.id.actionButtonCentral, pendingIntentCentral);
views.setOnClickPendingIntent(R.id.actionButtonLeft, pendingIntentLeft);
views.setTextViewText(R.id.actionButtonLeft, Main.textNamePhoneLeft);
views.setTextViewText(R.id.actionButtonCentral, Main.textNamePhoneCentral);
views.setTextViewText(R.id.actionButtonRight, Main.textNamePhoneRight);
manager.updateAppWidget(appWidgetId, views);
}
}
public void updateMyWidgets(Context context) {
AppWidgetManager man = AppWidgetManager.getInstance(context);
int[] ids = man.getAppWidgetIds(new ComponentName(context, SimpleWidgetProvider.class));
preferences = PreferenceManager.getDefaultSharedPreferences(context);
numberRight = preferences.getString(HmApplication.PREF_NUMBER_RIGHT, "");
numberCentral = preferences.getString(HmApplication.PREF_NUMBER_CENTRAL, "");
numberLeft = preferences.getString(HmApplication.PREF_NUMBER_LEFT, "");
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_IDS_KEY_RIGHT, ids);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_DATA_KEY_RIGHT, numberRight);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_IDS_KEY_CENTRAL, ids);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_DATA_KEY_CENTRAL, numberCentral);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_IDS_KEY_LEFT, ids);
updateIntent.putExtra(SimpleWidgetProvider.WIDGET_DATA_KEY_LEFT, numberLeft);
context.sendBroadcast(updateIntent);
}
这是我的清单:
<receiver android:name=".SimpleWidgetProvider"
android:label="myWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/simple_widget_info" />
</receiver>
实施 android.intent.action.BOOT_COMPLETED
接收器和 onRecieve 方法调用您的方法 updateMyWidgets
以更新小部件
您需要在清单中使用操作名称 android.intent.action.BOOT_COMPLETED
.
<!-- Start the Service if applicable on boot -->
<receiver android:name="com.test.MyReceiver ">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
确保还包含完整的启动权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
现在实现接收器
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
YourClass.updateMyWidgets();// you may need to make this method static.
}
}