Android-widget Tasten aufhören zu arbeiten
Ich habe ein Android-Anwendung mit einem widget, das hat Tasten. Dieser code funktioniert.
Den Tasten auf der widget - aufhören zu arbeiten, wenn etwas passiert, wie das ändern der Sprache des Telefons. Ich verwenden Sie gemeinsame Vorlieben, so , wenn der Benutzer installiert die app (ohne deinstallation), die Tasten funktionieren wieder und die Einstellungen bleiben die gesetzte.
- Habe ich bemerkt, die Absichten in meinem
AppWidgetProvider
- Klasse (code unterhalb dieser Analyse) werden nicht ausgelöst angemessen. - Ich habe eine
Toast
Nachricht an dieCall1
Klasse instanziiert vonAppWidgetProvider
, aber es wird nicht angezeigt. - Meine
UpdateService.java
ist nur immer die Einstellungen verändern und anpassen der widget-Aussehen, also ich glaube nicht, dass es vielleicht sein könnte in Bezug auf mein Problem. - Meine
Main.java
- Datei besteht nur aus Spinnern und spart gemeinsame Vorlieben, was bedeutet, dass ich wählen Sie "Computer" ein spinner, so dass die "Computer" - text erscheint auf dem widget. Es wird auch nicht verschwinden, wenn ich die Sprache des Telefons, und weder die Bilder. Daher glaube ich, dassUpdateService.java
muss ok sein.
Hier ist die AppWidgetProvider Klasse:
public class HelloWidget extends AppWidgetProvider {
public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget";
public static String ACTION_WIDGET_CONFIGURE2 = "ConfigureWidget";
public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";
public static String ACTION_WIDGET_RECEIVER2 = "ActionReceiverWidget";
private static final int REQUEST_CODE_FOUR = 40;
private static final int REQUEST_CODE_FIVE = 50;
private static final int REQUEST_CODE_SIX = 60;
private static final int REQUEST_CODE_SEVEN = 70;
private static final int REQUEST_CODE_EIGHT = 80;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
context.startService(new Intent(context, UpdateService.class));
//Intent widgetUpdateIntent = new Intent(context, UpdateService.class);
//context.startService(widgetUpdateIntent );
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetmain2);
//P1 starts Call1.class
Intent configIntent4 = new Intent(context, Call1.class);
configIntent4.setAction(ACTION_WIDGET_CONFIGURE);
PendingIntent configPendingIntent4 = PendingIntent.getActivity(context, REQUEST_CODE_FOUR, configIntent4, 0);
remoteViews.setOnClickPendingIntent(R.id.ImageView01, configPendingIntent4);
//P2 starts Call2.class
Intent configIntent5 = new Intent(context, Call2.class);
configIntent5.setAction(ACTION_WIDGET_CONFIGURE);
PendingIntent configPendingIntent5 = PendingIntent.getActivity(context, REQUEST_CODE_FIVE, configIntent5, 0);
remoteViews.setOnClickPendingIntent(R.id.ImageView02, configPendingIntent5);
//P3 starts Call3.class
Intent configIntent6 = new Intent(context, Call3.class);
configIntent6.setAction(ACTION_WIDGET_CONFIGURE);
PendingIntent configPendingIntent6 = PendingIntent.getActivity(context, REQUEST_CODE_SIX, configIntent6, 0);
remoteViews.setOnClickPendingIntent(R.id.ImageView03, configPendingIntent6);
//P4 starts Call4.class
Intent configIntent7 = new Intent(context, Call4.class);
configIntent7.setAction(ACTION_WIDGET_CONFIGURE);
PendingIntent configPendingIntent7 = PendingIntent.getActivity(context, REQUEST_CODE_SEVEN, configIntent7, 0);
remoteViews.setOnClickPendingIntent(R.id.ImageView04, configPendingIntent7);
//P5 starts Call5.class
Intent configIntent8 = new Intent(context, Call5.class);
configIntent8.setAction(ACTION_WIDGET_CONFIGURE);
PendingIntent configPendingIntent8 = PendingIntent.getActivity(context, REQUEST_CODE_EIGHT, configIntent8, 0);
remoteViews.setOnClickPendingIntent(R.id.ImageView05, configPendingIntent8);
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action))
{
final int appWidgetId = intent.getExtras().getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID)
{
this.onDeleted(context, new int[] { appWidgetId });
}
}
else
{
if (intent.getAction().equals(ACTION_WIDGET_RECEIVER))
{
String msg = "null";
try {
msg = intent.getStringExtra("msg");
} catch (NullPointerException e) {
//Log.e("Error", "msg = null");
}
}
super.onReceive(context, intent);
}
}
}
Ich habe auch ein EditPreferences.java
, GlobalVars.java
und einige andere jetzt sinnlos Klassen. Die Namen der Klassen, die für sich sprechen.
Eine andere Sache. Ich habe auch ein Widgetmain.java
:
public class WidgetMain extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.widgetmain2);
}
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
{
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetmain2);
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
}
Edit: Wie wäre es damit:
Wenn ich installieren Sie dieses app auf mein Kollege ZTE Blade die textviews auf dem widget nicht geladen werden mit dem entsprechenden text, nur mit einer bestimmt in die strings.xml.
Wenn ich die app neu installieren (ohne deinstallation), die textviews werden geladen und alles ist fein. Dieses problem nicht auftauchen auf meinem HTC Desire HD.
Den textviews sind, laden in den oben genannten UpdateService.java wie diese (Teil-code):
RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.main);
updateViews.setTextViewText(R.id.widget_textview, name);
ComponentName thisWidget = new ComponentName(this, HelloWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, updateViews);
Selbst wenn "name" ist statisch (z.B. String name="Etwas"), das textview wird immer noch nicht geladen, bei der ersten Installation.
- Ich öffnete ein Kopfgeld auf diese Frage, da ich keine Fortschritte (in Wochen).
- Wie kommst du nie nennen super.onUpdate() in der update-Funktion?
- Ich nenne es, nur ich irgendwie verpasst aus dem code. Ich versuchte es als erste Zeile sowie der letzten Zeile der onUpdate-Funktion: super.onUpdate(Kontext, appWidgetManager, appWidgetIds);
- Ok, tut mir Leid. Ich lese deine Lösung genauer. Was ich nicht verstehe, ist, was Sie nennen Ihre "Update-Service" - Schleife. Was genau ist Ihr service zu tun? Sehen Sie, ich brauche keinen service in meinem widget. Sollte ich einfach einen timer einstellen, um in regelmäßigen Abständen überprüfen, ob das widget muss aktualisiert werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, aktualisieren Sie die RemoteViews mit der click-Listener, Wann immer Sie erstellen eine neue Instanz der "neuen RemoteViews". Vielleicht die RemoteViews sind frisch geladen aus der XML in einigen Fällen, deswegen ist der Klick-Listener muss neu belegt werden.
Es ist möglich, es ist im Zusammenhang, wie viel Sie es verwenden können, um "refresh" der pending intent. Ich habe ein ähnliches Problem in meinem appwidget, dass ein image-Taste reagiert nicht mehr auf Klicks, nachdem einige zufällige Lauf-Zeit (in Stunden).
Ich diesen thread gefunden:
AppWidget Button onClick funktioniert
Und dieses Zitat:
Gegeben, dass das widget update-Zeit ist normalerweise eingestellt auf viele Stunden oder Tage (bei mir ist 86400000 ein milli Sekunden), um zu verhindern, dass das Telefon geht aus dem suspend jeder so viele Minuten Ihr widget wird nicht so oft onUpdate. Es ist möglich, dass das setzen der pending intent AUCH in der update-service wird verhindern, dass das problem, das Sie beschreiben.Jedes mal, wenn der update-Dienst läuft die angemeldete Absicht neu erstellt.
Habe ich heute Hinzugefügt, diese möglichst fix zu meinem appwidget und ich muss warten und sehen, ob das Update wirklich funktioniert, aber so weit so gut.
Habe ich den folgenden code in der update-service' - Schleife, wo es erfrischt jedes widget:
Das problem ist, dass Sie nicht tun können, ein partiall-update für ein widget, müssen Sie legen Sie die widget-Funktionen, wie das setzen von PendingIntent, jedes mal, wenn Sie drücken Sie eine neue remoteView. (Partiall-updates sind nur verfügbar für API14 und aufwärts...).
Den Grund Ihres widgets verlieren Ihre pendingIntents ist, dass das android-system speichert die remoteView, und baut Sie Ihr widget mit ihm, im Fall er setzt das widget (Mangel an memmory, TaskManager/taskKiller im Einsatz, etc...), so müssen Sie legen Sie die update-code für das widget in der remoteView in Ihrem updateService. Ansonsten ist es einfach nicht eingestellt das pendingIntents wieder.
Also nur den code hinzufügen Einstellung der pendingIntents auf den Dienst und Ihr problem wird gelöst werden =]
Ich denke, die PendingIntents möglicherweise müssen Sie ein flag übergeben, um Sie, vielleicht versuchen zu ändern:
zu:
Aus der PendingIntent Dokumentation, ich denke, code '0' ist nicht definiert. In diesem Fall FLAG_UPDATE_CURRENT würde am besten funktionieren, wie Sie wahrscheinlich wollen, aktualisieren Sie die Absicht, jedes mal, wenn die Schaltfläche geklickt wird.
Angesichts all der Informationen, die Sie gab, würde ich sagen, deine update-Methode wird nicht ausgelöst, richtig, wenn die Einstellungen geändert werden.
Ich erwarten, dass nach so viel tests, die Sie überprüft haben, Ihre Manifest-Datei enthält:
Haben Sie bestätigt
onUpdate
immer läuft? Es scheint mir, dass, wenn Sie das Programm neu installieren, ohne zu deinstallieren löst Ihre Probleme, es könnte sein, weil es zwingt einen update-Aufruf.Nach sorgfältiger Prüfung, es stellt sich heraus, dass ScanPlayGames hat einen Punkt: die offizielle Dokumentation Beispiel verwendet super.onUpdate(). Beachten Sie, dass es verwendet es am Ende der Methode, sondern mehrere Beispiele im Internet Stand, Sie sind besser bedient mit ihm am start der Methode.
Ich habe das problem für lange Zeit. Mein widget-Taste @(onUpdate). Das widget ist ein Dienst für updates. Die Schaltfläche auf dem widget aufhören zu arbeiten, wenn etwas passiert, wie: änderung der schriftart, etc..
Wenn ich die app installieren, die Taste funktioniert wieder. Schließlich merkte ich, dass ich nie aufgerufen onUpdate in meinem Service-Klasse.
Aufrufen onUpdate von der service-Klasse das problem behoben.
Falls jemand noch dieses problem hat, versuchen Sie das Attribut android:updatePeriodMillis in Ihrem AppWidgetProviderInfo;
Das Betriebssystem kann töten die angemeldete Absicht, aus verschiedenen Gründen, und Ihre Tasten aufhören zu arbeiten. Wenn Sie dieses Attribut setzen, können Sie sagen, Android -, als Sie sollten rufen Sie die onUpdate-Methode in der AppWidgetProvider, so dass alle pending-intents werden neu erstellt.