2014-09-08 2 views

Répondre

0

Si vous connaissez l'implémentation du widget écran d'accueil, c'est facile. À partir du code ci-dessous, vous pouvez déterminer comment utiliser une disposition différente pour l'écran verrouillé et l'écran d'accueil pour afficher l'heure actuelle toutes les secondes.

Créer une présentation différente pour les widgets différents

@ layout/widget_keyguard // Pour l'écran de verrouillage widget de

@ layout/widget_home // Pour un widget écran d'accueil

Remarque: Utilisez un TextView avec id time_view sur les deux mises en page pour afficher l'heure

xml/widget_info.xml

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:initialKeyguardLayout="@layout/widget_keyguard" // layout for lock screen 
    android:initialLayout="@layout/widget_home" // layout for lock screen (if not provided) & home screen 
    android:minHeight="100dp" 
    android:minWidth="300dp" 
    android:previewImage="@drawable/ic_launcher" 
    android:resizeMode="none" 
    android:updatePeriodMillis="180000" 
    android:widgetCategory="keyguard|home_screen" > //Enable widgets on both home screen and lock screen 
</appwidget-provider> 

AppWidgetProvider.java

public class TestAppWidgetProvider extends AppWidgetProvider { 

     @Override 
     public void onDeleted(Context context, int[] appWidgetIds) { 
      super.onDeleted(context, appWidgetIds); 
     } 

     @Override 
     public void onDisabled(Context context) { 

      Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 

      PendingIntent sender = PendingIntent 
        .getBroadcast(context, 0, intent, 0); 

      AlarmManager am = (AlarmManager) context 
        .getSystemService(Context.ALARM_SERVICE); 
      am.cancel(sender); //When all the widgets are disabled, do not forget to cancel the service 

      super.onDisabled(context); 
     } 

     @Override 
     public void onEnabled(Context context) { 

      super.onEnabled(context); 

      Toast.makeText(context, "Widget Enabled", Toast.LENGTH_SHORT).show(); 

       //AlarmManager to update the widgets 
      Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 

      PendingIntent p_intent = PendingIntent.getBroadcast(context, 0, intent, 
        0); 
      AlarmManager am = (AlarmManager) context 
        .getSystemService(Context.ALARM_SERVICE); 

      // Here I am updating the widgets every second (1000 ms) , you can use however you want 
      am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 
        1000, p_intent); 

     } 

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

      Toast.makeText(context, "Widget Updated", Toast.LENGTH_SHORT).show(); 

      ComponentName thisWidget = new ComponentName(context, 
        TestAppWidgetProvider.class); 

      for (int widgetId : appWidgetManager.getAppWidgetIds(thisWidget)) { 

       Bundle myOptions = appWidgetManager.getAppWidgetOptions(widgetId); 
       int category = myOptions.getInt(
         AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1); 

       RemoteViews remoteViews; 
       if (category == AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD) { 
        // Get the remote views 
        remoteViews = new RemoteViews(context.getPackageName(), 
          R.layout.widget_keyguard); 
       } 

       else { 
        remoteViews = new RemoteViews(context.getPackageName(), 
          R.layout.widget_home); 
       } 

       SimpleDateFormat dateFormat = new SimpleDateFormat(
         "HH:mm:ss", Locale.US); 
       // use TextView with time_view id on both home screen & lock screen layouts 
       remoteViews.setTextViewText(R.id.time_view, 
         dateFormat.format(new Date(System.currentTimeMillis()))); 
       appWidgetManager.updateAppWidget(widgetId, remoteViews); 
      } 
     } 

     @Override 
     public void onAppWidgetOptionsChanged(Context context, 
       AppWidgetManager appWidgetManager, int appWidgetId, 
       Bundle newOptions) {     
     } 

    } 

classe AlarmManagerBroadcastReceiver

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 


      ComponentName thiswidget = new ComponentName(context, 
        TestAppWidgetProvider.class); 

      AppWidgetManager appWidgetManager = AppWidgetManager 
        .getInstance(context); 


      for (int widgetId : appWidgetManager.getAppWidgetIds(thiswidget)) { 
       Bundle myOptions = appWidgetManager.getAppWidgetOptions(widgetId); 
       int category = myOptions.getInt(
         AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1); 

       RemoteViews remoteViews; 
       if (category == AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD) { 
        // Get the remote views 
        Log.d("Widget", "Lockscreen widget"); 
        remoteViews = new RemoteViews(context.getPackageName(), 
          R.layout.widget_keyguard); 
       } 

       else { 
        Log.d("Widget", "Homescreen widget"); 
        remoteViews = new RemoteViews(context.getPackageName(), 
          R.layout.widget_home); 
       } 
       SimpleDateFormat dateFormat = new SimpleDateFormat(
         "HH:mm:ss", Locale.US); 

       // use TextView with time_view id on both home screen & lock screen layouts       
       remoteViews.setTextViewText(R.id.time_view, 
         dateFormat.format(new Date(System.currentTimeMillis()))); 

       appWidgetManager.updateAppWidget(widgetId, remoteViews); 
      } 

     } 

    } 

Enfin, ne pas oublier de mettre à jour le fichier manifeste

 <application 
      ... 

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

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

     ..... 
     </application> 

qui est tout.

J'espère que ça va vous aider à résoudre votre problème

+0

Merci @Adarsh ​​Urs. Je suis toujours occupé avec un autre projet. Je ne peux pas l'essayer maintenant. Je pense que ça devrait marcher. Je vais accepter votre réponse. Mais je pense que je ne vais pas l'implémenter de toute façon puisque Android 5.0 a supprimé la possibilité de mettre un widget sur l'écran de verrouillage. – rxlky

Questions connexes