2011-01-07 4 views
13

J'écris un widget qui affichera un compte à rebours. J'ai le widget fonctionnant comme je le veux jusqu'à ce que je retourne le téléphone de paysage en portrait. Mon widget ne se met pas à jour et retourne à son état initial au démarrage du widget jusqu'à ce qu'un onupdate soit appelé par mon alarme récurrente. Je voudrais appeler un onupdate manuellement une fois que l'orientation change pour mettre à jour mon widget. Je fais des recherches depuis un moment maintenant et j'ai découvert que je dois utiliser un service qui surveillera les changements d'orientation et appellera mon onupdate pour mon widget.Comment utiliser un service pour surveiller le changement d'orientation dans Android

Mon problème est que je ne peux pas trouver une réponse directe quant à la façon d'utiliser un service pour surveiller le changement. J'ai vu qu'avec une activité je peux ajouter android: configChanges = "orientation | keyboardHidden" au manifeste pour une activité et utiliser un onConfigurationChanged, mais je peux le faire pour un service. Si c'est le cas, comment? Y a-t-il une meilleure façon de surveiller le changement d'orientation? J'ai également lu sur Internet qu'un service n'est pas la meilleure façon de le faire non plus.

J'ai vu des tutoriels pour créer des écouteurs d'orientation, mais ils semblent utiliser des appels de fonction dépréciés.

Merci à l'avance

+0

vous ne trouvez jamais une bonne solution pour cela? – Patrick

Répondre

1

Vous pouvez créer un BroadcastReceiver qui écoute Intent.ACTION_CONFIGURATION_CHANGED (android.intent.action.CONFIGURATION_CHANGED)

Notez qu'il ne dit:

Vous ne pouvez pas recevoir ce par composants déclarés dans les manifestes, seulement en l'inscrivant explicitement avec Context.registerReceiver().

Ce qui signifie que vous ne pouvez pas enregistrer votre destinataire dans le fichier manifeste. Vous devriez l'enregistrer dans le code.

puis obtenez la configuration et vérifiez quelle est l'orientation indiquée par Floern.

+0

Est-il possible de _Intent.ACTION_CONFIGURATION_CHANGED_ à appwidgetprovider puisqu'il s'agit d'un récepteur de diffusion modifié? Je ne devine pas. Lorsque je crée le récepteur de diffusion, ai-je besoin de le démarrer quelque part ou le démarre-t-il automatiquement lorsque mon Widget démarre? – Dysen

+0

J'ai enfin compris comment mettre en œuvre ce dont vous parlez. Ma prochaine question est pourquoi est-ce que je devrais enregistrer le récepteur dans un service? le service ne sortirait-il pas après l'enregistrement? Pourrais-je enregistrer le Receiver dans l'activité widgetconfiguration? L'entité qui a enregistré le récepteur de diffusion doit-elle rester en mémoire pour pouvoir l'exécuter? – Dysen

13

S'il vous plaît trouver ci-dessous un exemple qui fait ce que vous demandez, espérons que cela aide.

public class ScreenOrientationListener extends Activity { 

    private static final String TAG = "ScreenOrientationListener"; 

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

     mContext = this; 

     setContentView(R.layout.main); 

     startService(new Intent(this, MyService.class)); 
    } 
} 

et vient classe MyService

public class MyService extends Service { 
    private static final String TAG = "MyService"; 

    private static final String BCAST_CONFIGCHANGED = "android.intent.action.CONFIGURATION_CHANGED"; 
    private static Context mContext; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     Log.d(TAG, "onCreate()"); 

     mContext = this; 

     IntentFilter filter = new IntentFilter(); 
     filter.addAction(BCAST_CONFIGCHANGED); 
     this.registerReceiver(mBroadcastReceiver, filter); 
    } 

    @Override 
    public void onDestroy() {   
     Log.d(TAG, "onDestroy()"); 
     //Unregister receiver to avoid memory leaks 
     mContext.unregisterReceiver(mBroadcastReceiver); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
     Log.d(TAG, "onStart()"); 
    } 

    public BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent myIntent) { 

      if (myIntent.getAction().equals(BCAST_CONFIGCHANGED)) { 

       Log.d(TAG, "received->" + BCAST_CONFIGCHANGED); 


       if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ 
        // it's Landscape 
        Log.d(TAG, "LANDSCAPE"); 
       } 
       else { 
        Log.d(TAG, "PORTRAIT"); 
       } 
      } 
     } 
    }; 
} 

et voici ici la partie pour définir MyService dans le fichier manifeste

<!-- Services --> 
     <service android:enabled="true" android:name="com.wareninja.android.external.screenorientationlistener.services.MyService"> 
      <intent-filter> 
       <action android:name="android.intent.action.CONFIGURATION_CHANGED"/> 
      </intent-filter> 
     </service> 
+0

Le problème est que cela ne fonctionnera que si l'application prend en charge la rotation. Donc, si votre lanceur ne supporte pas la rotation en paysage, cela ne fonctionnera pas à partir d'un service. Ma conjecture serait d'utiliser les capteurs pour l'obtenir, mais je ne sais pas comment. –

+0

@WareNinja: Ce qui précède ne fonctionne pas si l'utilisateur a manuellement changé l'orientation en cliquant sur le bouton "Rotation automatique" dans la barre de notification. – ChuongPham

+0

@ChuongPham: Rotation automatique et changer manuellement l'orientation? pourriez-vous m'expliquer davantage, c'est confus ce que vous essayiez de dire? – xmen

0

Je vous suggère d'utiliser un objet OrientationEventListener. Il fait exactement ce que vous cherchez et il n'est pas obsolète. Il a été autour depuis API niveau 3.

+0

OrientationEventListener ne fonctionne pas si l'utilisateur a manuellement changé l'orientation en cliquant sur le bouton "Auto Rotation" dans la barre de notification et d'avoir le téléphone à plat sur une surface. Cela ne fonctionnera que si l'utilisateur décroche son téléphone et le déplace/le fait pivoter. – ChuongPham

20

Service#onConfigurationChanged(Configuration newConfig) fonctionne pour moi. Pas besoin d'enregistrer les récepteurs pour mon opinion. Je n'ai également ajouté aucun filtre à AndroidManifest. Est-ce que j'ai manqué quelque chose dans la discussion puisque personne n'a suggéré cette solution? Mon service s'exécute au premier plan.

juste place dans votre service:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    //Your handling 
} 
+1

Oui, cela fonctionne et est beaucoup plus simple que l'inscription aux intentions de diffusion! – Flyview

Questions connexes