Aller au contenu

Appwidget mise a jour


skywallker

Recommended Posts

bonjours ,

bonjour ,

je débute en programmation android ( j'ai un livre sur la programmation android ), je voudrai quelques précision sur la classe appWidget

je détaille un peu le widget que je veux créer icon_smile.gif

un widget qui affiche du texte et qui au bout de quelque minute ce met a jour pour afficher un autre texte

1)

la méthode onEnable(Context context){}

est lancé lors de la création du widget

donc je m'en servir pour initialiser mon widget

par exemple ajouter les textes a afficher a une ArrayList

mais j'ai l’impression que cette méthode n'est jamais exécuter

mon Arraylist n'est jamais instancier

2)

la méthode onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

}

j'ai lu que la méthode onUpdate() se lance lors de la création de celui-ci

et c'est ce que j'ai pu constater

mais il y a un point obscure ( pour moi )

la méthode Update est lance lors d'une mise a jour

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
	 xmlns:android="http://schemas.android.com/apk/res/android"	
	  android:minWidth="296dip"
   android:minHeight="72dip"		
	  android:updatePeriodMillis="10000"
	  android:initialLayout="@layout/napply_widget_layout"		
	  />

ici si j'ai bien compris la méthode onUpdate est lancé toute les 10000 milliseconde ( 10 s)

mais j'ai l’impression qu'elle n'est exécuter qu'une fois, au début

donc je voudrai savoir si ce que je viens d'énoncer comporte des erreurs ( j'espére ) car sinon je suis perdu icon_smile.gif

voici le code de mon widget

package azerty.uouou;

import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.view.View;
import android.os.Bundle;
import android.widget.RemoteViews;

public class NapplyWidget extends AppWidgetProvider {

String[] list ;
static int cpt = 0;
boolean test ;

/* cette méthode ne s'exécute jamais , c'est dommage */

public void onEnable(Context context){
 list = new String[5];
 list[0]= "kkkkkkkk0";
 list[1]= "kkkkkkkk1";
 list[2]= "kkkkkkkk2";
 list[3]= "kkkkkkkk3";
 list[4]= "kkkkkkkk4";
}  

 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

/*partie utilisé car la méthode onEnable ne marche pas ( pour compenser)*/
/****************************************************/
  if(!test){  
  list = new String[5];
  list[0]= "kkkkkkkk0";
  list[1]= "kkkkkkkk1";
  list[2]= "kkkkkkkk2";
  list[3]= "kkkkkkkk3";
  list[4]= "kkkkkkkk4";
  test = true;
 }  
/******************************************/
  if(cpt >5){
cpt = 0;
  }  

final int N = appWidgetIds.length;
String s = list[cpt];
cpt++;
/* au cas ou plusieur appWidget son créer */
   for (int i = 0; i < N; i++) {
	   int appWidgetId = appWidgetIds[i];
	   updateAppWidget(context, appWidgetManager, appWidgetId , s );
   }
  }


  static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId , String s) {
/*on récupére la le widget et on le met a jour  */
   String t = s;		
   RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.napply_widget_layout);
   views.setTextViewText(R.id.text1, t);
   appWidgetManager.updateAppWidget(appWidgetId, views);



  }
}

Merci a vs

Lien vers le commentaire
Partager sur d’autres sites

donc je voudrai savoir si ce que je viens d'énoncer comporte des erreurs ( j'espére ) car sinon je suis perdu icon_smile.gif

Rassures toi il y a au moins une erreur :P

@Override
public void onEnabled(Context context){
 }

n'oublie pas le 'd' de onEnabled

Si tu penses à mettre @Override au dessus des méthodes que tu surcharges, le compilateur t'indiquera une erreur alors que dans ton cas il a simplement déclaré une nouvelle méthode qui évidement ne sera jamais appelée par la mère (AppWidgetProvider)

Pour ton second problème, il faut savoir que updatePeriodMillis est dans tous les cas limité à des appels successifs de 30 minutes voir la doc :

http://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo.html#updatePeriodMillis

voilà, voilà, et surtout ne perd pas patience, les widgets ne sont pas évidents à coder :emo_im_undecided:

pour faire le mien (dynamic dock) je me suis beaucoup inspiré de celui fourni par google :

http://developer.and...mple/index.html

Lien vers le commentaire
Partager sur d’autres sites

alors je compte gérer la mise a jour de mon widget par moi meme

je voudrai que celui-ci se met a jour toute les 10s ( cad qu'il fait apelle a la méthode onUpdate toute les 10s)

je créer un une activité de configuration pour mon widget :

package azerty.uouou;

import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

public class WidgetConfigure extends Activity{ 
private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 
@Override
protected void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);

// On essaye de récupérer l'id de l'AppWidget
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) 
{
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
}

// Si l'intent ne contient pas son ID, ça ne sert à rien de continuer.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) 
{
setResult(RESULT_CANCELED);
finish();
}

Intent intent2 = new Intent(this,Maj.class);
startService(intent2); 

// IMPORTANT : penser à renvoyer l'ID du widget
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
}

}

dans celle-ci comme vous pouvez le voir j'utilise :

Intent intent2 = new Intent(this,Maj.class);
startService(intent2); 

pour faire appelle a un service qui va mettre a jour mon widget

voici la classe Maj :

 package azerty.uouou;

import android.app.Activity;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;

public class Maj extends Service {
private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;

public void onCreate() {
super.onCreate(); 

}  
public void onStart(Intent intent) {
super.onStart(intent, mAppWidgetId); 


} // SDK<2.0 la tâche de fond démarre 
public int onStartCommand(Intent intent, int flags, int startId){

while(true){

try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Intent intent2 = new Intent(NapplyWidget.maj);
                   /*maj == AppWidgetManager.ACTION_APPWIDGET_UPDATE;*/
sendBroadcast(intent); 

}
}; // SDK>2.0 la tâche de fond démarre 

public void onDestroy() {
} // libération des ressources 
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

}



ici mon service utilise un intent pour dire a la classe Napplywidget d'utilisé sa classe onUpdate :)

bon mais sa marche pas :(

je voudrai savoir si je suis sur la bonne voie ou j'ai rien compris

merci

Lien vers le commentaire
Partager sur d’autres sites

... le coup du service pour mettre à jour ton widget n'est pas forcément une très bonne idée et ce n'est pas moi qui le dit : http://www.androidgu...rvices-are-not/

Le mieux ( ou le moins pire diront certain) pour un update aussi fréquent (quelques secondes) c'est d'utiliser AlarmManager comme ici :

http://android-er.bl...rm-manager.html

Dans tous les cas si ton appli doit devenir publique, il vaudrait mieux que la fréquence d'update soit paramétrable car sinon ça va faire mal à la batterie :P

Lien vers le commentaire
Partager sur d’autres sites

merci je comprend mieux l'utilisation des services et la mise a jour du widget

j'ai un probléme avec mon fichier de configuration de widget , je comprend pas ce qu'il manque

voici mon widget :

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
	 xmlns:android="http://schemas.android.com/apk/res/android"		
	  android:minWidth="296dip"
	  android:minHeight="72dip"		  
	  android:updatePeriodMillis="0"
	  android:initialLayout="@layout/napply_widget_layout"
/* ******************partie importante ***********/
	  android:configure="azerty.uouou.PdConfig"	  
/*********************************************************************/

/> 

et voici mon manifeste :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="azerty.uouou"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
	android:icon="@drawable/ic_launcher"
	android:label="@string/app_name" >

	<receiver android:name=".JBBWidget">			 			
		<intent-filter>
			<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
		</intent-filter>
		<intent-filter>
	   		<action android:name="MY_OWN_WIDGET_UPDATE" />
	   </intent-filter>

		 <meta-data android:name="android.appwidget.provider"
			android:resource="@xml/napply_widget_meta" />

	</receiver>
	/******* partie important***************/
	<!-- Configure activity -->
	 <activity android:name=".PdConfig">			  
		<intent-filter>
		   <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
		</intent-filter>			
	 </activity>
	/************************************/

	</application>
</manifest>

et pour finir mon Activité de configuration du widget :)


package azerty.uouou;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RemoteViews;
import android.widget.Toast;

public class PdConfig extends Activity {

private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;

  @Override
  public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		Intent intent = getIntent();
		Bundle extras = intent.getExtras();
		if (extras != null)
		{
			mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
		}

		// Si l'intent ne contient pas son ID, ça ne sert à rien de continuer.
		if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID)
		{
			setResult(RESULT_CANCELED);
			finish();
		}


		/*******partie importante********************/

		 Intent intent1 = new Intent(NapplyWidget.MY_WIDGET_UPDATE);
		 PendingIntent pendingIntent = PendingIntent.getBroadcast(PdConfig.this, 0, intent1, 0);
		 AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

		 Calendar calendar = Calendar.getInstance();
		 calendar.setTimeInMillis(System.currentTimeMillis());
		 calendar.add(Calendar.SECOND, 10);
		 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 2000, pendingIntent);
              /******************************************************/		

		// IMPORTANT(ou pas) : penser à renvoyer l'ID du widget
		Intent resultValue = new Intent();
		resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
		setResult(RESULT_OK, resultValue);
		finish();



		/*
		setContentView(R.layout.config);

		Button j =  ((Button)findViewById(R.id.button1));

		j.setOnClickListener(new View.OnClickListener() {				
			@Override
			public void onClick(View v) {
				Toast.makeText(PdConfig.this, "Bouton cliqué !", Toast.LENGTH_LONG).show();
				finish();
			}
		});		
		*/		
  }

}

a chaque fois que je compile sa plante, je ne comprend pas ,des fois

mon activité de configuration s'affiche alors que je ne lui met pas de vu , sa donne un écran noire quand je créer le widget puis il disparaît ( grace au finish()) mais mon widget n’apparaît jamais sur l’écran du bureau.

mon widget s'affiche sur l'écran quand je ne lui met pas d'activité de configuration

Lien vers le commentaire
Partager sur d’autres sites

à chaque fois que je compile ça plante,

Tu peux être un peu plus précis ... :rolleyes:

mon widget n’apparaît jamais sur l’écran du bureau.

Quand tu utilises un écran de config, tu dois explicitement demander au widget de se mettre à jour.

, if you have declared a configuration Activity, this method is not called when the user adds the App Widget, but is called for the subsequent updates. It is the responsibility of the configuration Activity to perform the first update when configuration is done.

Tout est expliqué ici :

Mais bon il y a peut être un autre problème, regarde bien le logcat.

Lien vers le commentaire
Partager sur d’autres sites

Je te remercie du fond du coeur :)

Mon application fonctionne :)

:)

:)

:)

XD !!!!

[color=red]koi[/color] sa marche sur l'émulateur mais pas sur mon phone android !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WTF !!!!!!!!!!!!!!!!!!

help :( aurai tu une idée ,mon application( c'est aussi un peut la tienne car tu ma aidé :) ) a était dévellopé en 2.2 je l'ai aussi testé en 2.3.3 sur un autre emulateur

mon phone est en 2.3.3 et j'ai l'impression que le alarmmanager ne marche pas sur mon téléphone car mon texte ne change pas

après je t’embête plus :)

Lien vers le commentaire
Partager sur d’autres sites

  • 3 weeks later...

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...