17

Ich habe einen BroadcastReceiver und erklärt es so:BroadcastReceiver für WALLPAPER_CHANGED ruft OnReceive() mehrere Male: Android

<receiver 
    android:name="com.services.Receiver" 
    android:enabled="true" 
    android:exported="true" > 
    <intent-filter android:priority="999" > 
     <action android:name="android.intent.action.WALLPAPER_CHANGED" /> 
    </intent-filter> 
</receiver> 

und der Empfänger:

@Override 
public void onReceive(final Context context, final Intent intent) 
{ 
    change_wallpepar.myPrefs = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE); 
    new Handler().postDelayed(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      Log.d("MAYUR", "<< wallpepar changed >>"); 
      if (change_wallpepar.myPrefs.getLong("temp_for_change", 1) == 0) 
      { 
       context.stopService(new Intent(context, change_wallpepar.class)); 
      } 
      else 
      { 
       SharedPreferences.Editor e = change_wallpepar.myPrefs.edit(); 
       e.putLong("temp_for_change", 0); 
       e.commit(); 
      } 
     } 
    }, 4000); 
} 

Wenn ich das Hintergrundbild ändern es hier sollte einmal aufgerufen werden. Es funktioniert wirklich wie von meinen Erwartungen für eine Weile, nach einigen Minuten ruft es onreceive() mehrere (10-18) mal, obwohl die Änderung in Tapete einmal erfolgt ist. Noch seltsamer ist, dass es auf einem Samsung Galaxy Tablet Version 4.4.2 funktioniert, aber nicht auf Motorola (Moto E 4.4.4) funktioniert.

Mein Service:

public class change_wallpepar extends Service { 

    @Override 
    public void onCreate() 
    { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
     mytimer = new Timer(); 
     wpm = WallpaperManager.getInstance(change_wallpepar.this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     // TODO Auto-generated method stub 
     myPrefs = getSharedPreferences("myPrefs", MODE_PRIVATE); 
     intervall = myPrefs.getLong("someValue", 60000); 

     path_of_wallpepar.clear(); 
     path_of_wallpepar.add("" + "/storage/emulated/0/Android/data/WallpeparAppHistoryPhotos/514.jpg"); 
     path_of_wallpepar.add("" + "/storage/emulated/0/Android/data/WallpeparAppHistoryPhotos/513.jpg"); 

     DisplayImageOptions defaultOption = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).bitmapConfig(Bitmap.Config.RGB_565).build(); 
     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(change_wallpepar.this).defaultDisplayImageOptions(defaultOption).build(); 
     ImageLoader.getInstance().init(config); 

     mytimer.schedule(new TimerTask() 
     { 
      @Override 
      public void run() 
      { 

       try 
       { 
        wpm.setBitmap(ImageLoader.getInstance().loadImageSync("file://" + path_of_wallpepar.get(temper))); 

       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 

       temper++; 

       if (temper == path_of_wallpepar.size()) 
        temper = 0; 

       SharedPreferences.Editor e = change_wallpepar.myPrefs.edit(); 
       e.putLong("temp_for_change", 1); 
       e.commit(); 

       Log.e("MAYUR", "wallpepar seted"); 

      } 
     }, 0, intervall); 

     return super.onStartCommand(intent, flags, startId); 

    } 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     // TODO Auto-generated method stub 

     return null; 
    } 

    public void onDestroy() 
    { 
     Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show(); 
     Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
     v.vibrate(1000); 
     mytimer.cancel(); 
     super.onDestroy(); 
    } 

} 

Meine Logcat Ausgabe lautet:

## Logcat ## 
04-16 11:06:30.654: E/MAYUR(3405): wallpepar seted 
04-16 11:06:34.636: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:06:59.584: E/MAYUR(3405): wallpepar seted 
04-16 11:07:03.551: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:07:30.078: E/MAYUR(3405): wallpepar seted 
04-16 11:07:33.979: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:07:59.433: E/MAYUR(3405): wallpepar seted 
04-16 11:08:03.340: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:08:30.029: E/MAYUR(3405): wallpepar seted 
04-16 11:08:33.933: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:08:59.481: E/MAYUR(3405): wallpepar seted 
04-16 11:09:03.383: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:09:30.066: E/MAYUR(3405): wallpepar seted 
04-16 11:09:33.966: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:09:59.448: E/MAYUR(3405): wallpepar seted 
04-16 11:10:03.353: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:10:30.049: E/MAYUR(3405): wallpepar seted 
04-16 11:10:33.955: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:10:59.455: E/MAYUR(3405): wallpepar seted 
04-16 11:11:03.350: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:11:30.182: E/MAYUR(3405): wallpepar seted 
04-16 11:11:34.177: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:11:59.406: E/MAYUR(3405): wallpepar seted 
04-16 11:12:03.315: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:30.025: E/MAYUR(3405): wallpepar seted 
04-16 11:12:33.929: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:34.103: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:34.298: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:34.497: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:34.676: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:34.854: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:35.022: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:35.190: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:35.355: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:35.522: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:35.683: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:35.852: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:36.023: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:36.187: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:36.350: D/MAYUR(3405): << wallpepar changed >> 
04-16 11:12:36.513: D/MAYUR(3405): << wallpepar changed >> 

Antwort

3

Die wiederholten WALLPAPER_CHANGED Anrufe werden von kleineren Android-Geräten verursacht, die Crop-Scale-Zyklen auf dem Bild ausführen, um auf den Bildschirm zu passen. Dies wird in der AOSP code beobachtet. Es ist weniger wahrscheinlich, dass dieses Verhalten auftritt, wenn das Bildschirmverhältnis auf das Bild passt oder größer als das Bild ist. Aus diesem Grund weist das Tablet dieses Verhalten nicht auf.

Sie können dieses Problem beheben, indem doppelte Kontrolle auf Anzeichen von unerwünschtem Verhalten:

long lastExec = System.currentTimeMillis(); 

@Override 
public void onReceive(final Context context, final Intent intent) 
{ 
    change_wallpepar.myPrefs = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE); 
    new Handler().postDelayed(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      if(System.currentTimeMillis()-lastExec>1000) 
      { 
      Log.d("MAYUR", "<< wallpepar changed >>"); 
      if (change_wallpepar.myPrefs.getLong("temp_for_change", 1) == 0) 
      { 
       context.stopService(new Intent(context, change_wallpepar.class)); 
      } 
      else 
      { 
       SharedPreferences.Editor e = change_wallpepar.myPrefs.edit(); 
       e.putLong("temp_for_change", 0); 
       e.commit(); 
      } 
      } 
      lastExec = System.currentTimeMillis(); 
     } 
    }, 4000); 
} 
-1

meist möglicherweise ein Gerät spezifisches Problem.

Im Allgemeinen eine Fahne mit Ich denke, ist die recommended Lösung

@Override 
public void onReceive(final Context context, final Intent intent) 
{ 
    private static boolean firstReceive = true; 
    change_wallpepar.myPrefs = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE); 
    new Handler().postDelayed(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      if(firstReceive){ 
      Log.d("MAYUR", "<< wallpepar changed >>"); 
      if (change_wallpepar.myPrefs.getLong("temp_for_change", 1) == 0) 
      { 
       context.stopService(new Intent(context, change_wallpepar.class)); 
      } 
      else 
      { 
       SharedPreferences.Editor e = change_wallpepar.myPrefs.edit(); 
       e.putLong("temp_for_change", 0); 
       e.commit(); 
      } 
     } 
    ///CHANGE firstReceive BASED ON EITHER TIME SINCE LAST WALLPAPER CHANGE 
    ///OR ANY OTHER PARAMETER THAT SUITS YOUR REQUIREMENT 
    }, 4000); 
    } 
} 

Bitte beachte, dass ich nicht die Flagge wieder im Loop zurückgesetzt haben, sollten Sie wahrscheinlich tun es nach einer gewissen Zeit seit der letzten Änderung OR gegen die einige aktuelle Tapete Kennung im gemeinsamen pref und Spiel speichern und das Kennzeichen usw., basierend auf Ihrer Anforderung

die Idee ist, t Umgehung er ausstellen, damit Sie über die Falschpositiven hinwegkommen und tatsächlich für echte wallpaper_change Anrufe wechseln. Dies ist eine Workaround und keine tatsächliche Lösung, warum das Problem besteht.

+0

firstReceive = false; nicht überall gemacht, ich denke, es ist nicht nützlich in meinem que. –

+0

Ja, das habe ich in meiner Antwort erwähnt. Es liegt an Ihnen, es korrekt zurückzusetzen, so dass Sie keine Fehlalarme zulassen, aber auch nicht die tatsächlichen Tapetenänderungen aussortieren – Slartibartfast

0

Ich bin nicht sicher, warum dies auf einigen Geräten passiert, aber es scheint mir höchstwahrscheinlich ein Problem mit diesem bestimmten Gerät zu sein. Während ich dieses Problem nicht lösen kann, könnten Sie möglicherweise eine Variable halten, die umgeschaltet wird, sobald Ihr Listener nach einer gewissen Zeit getroffen und zurückgesetzt wird. Dies wird dazu führen, dass Ihr Zuhörer zukünftige Anrufe für eine kurze Zeit ignoriert. Denken Sie daran wie Hochwasserschutz.

Ich weiß, dass das Ihr aktuelles Problem nicht löst, aber ich hoffe, dass es eine geeignete Problemumgehung bereitstellt.

Verwandte Themen