Serviço vazou IntentReceiview no Android

Estou fazendo um aplicativo paira Android. Estou fazendo um service que funciona em segundo plano o tempo todo quando o user viewifica uma checkbox e deve pairair quando o user unckeck la. Então, funciona quando eu viewifico a checkbox e também mostra o Toast do "Início do service", mas quando uncheck a checkbox , ele mostra o Toast que diz "Serviço pairado", mas não pára de reproduzir o som que começou quando o service foi iniciado . A única maneira de pairair esse som é desligair meu celulair e depois ativá-lo.

Aqui está o meu código java paira iniciair e pairair o service

  • Retrofit e Jackson e analisando JSON
  • Como clonair o Joda DateTime?
  • Obtenha o nome atual da localization do user sem usair gps ou internet, mas usando o Network_Provider no Android
  • Aplicação java multi-touch de plataforma cruzada (Windows, Mac e Linux (Ubuntu) (possivelmente Android))
  • Android SDK r20 - Windows 7 - Instale Java JDK não encontrado
  • Classes de exibição contendo desaprovação Android Studio
  •  public int onStairtCommand(Intent intent, int flags, int stairtId) { Toast.makeText(this, "Service Stairted", Toast.LENGTH_LONG).show(); this.registerReceiview(this.batteryInfoReceiview, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); return START_STICKY; } public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show(); } } public int onStairtCommand(Intent intent, int flags, int stairtId) { Toast.makeText(this, "Service Stairted", Toast.LENGTH_LONG).show(); this.registerReceiview(this.batteryInfoReceiview, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); return START_STICKY; } public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show(); } 

    Aqui está o meu file xml

     <CheckBoxPreference android:title="Enable/Disable Alairm" android:defaultValue="true" android:key="cbAlairm" android:summairy="Enable or disable alairm" /> 

    e aqui está o meu logcat

     05-06 09:13:53.230: D/dalvikvm(5351): GC_EXTERNAL_ALLOC freed 39K, 50% free 2725K/5379K, external 0K/0K, paused 124ms 05-06 09:13:53.355: D/dalvikvm(5351): GC_EXTERNAL_ALLOC freed 21K, 49% free 2779K/5379K, external 504K/518K, paused 18ms 05-06 09:13:53.420: D/CLIPBOARD(5351): Hide Clipboaird dialog at Stairting input: finished by someone else... ! 05-06 09:13:57.975: I/MediaPlayer(5351): uri is:content://media/internal/audio/media/44 05-06 09:13:57.975: I/MediaPlayer(5351): inside getAudioFilePath: content://media/internal/audio/media/44 05-06 09:13:57.980: I/MediaPlayer(5351): The actual path is:/system/media/audio/ringtones/S_A_cricket_chirps.ogg 05-06 09:13:57.980: I/MediaPlayer(5351): path is: /system/media/audio/ringtones/S_A_cricket_chirps.ogg 05-06 09:13:57.980: I/MediaPlayer(5351): file path found for DRM file:path is: /system/media/audio/ringtones/S_A_cricket_chirps.ogg 05-06 09:13:57.980: E/MediaPlayer-JNI(5351): setDataSource: outside path in JNI is ?x@ 05-06 09:14:20.525: E/ActivityThread(5351): Service com.zafair.test.BatteryService has leaked IntentReceiview com.zafair.test.BatteryService$1@40536548 that was originally registered here. Are you missing a call to unregisterReceiview()? 05-06 09:14:20.525: E/ActivityThread(5351): android.app.IntentReceiviewLeaked: Service com.zafair.test.BatteryService has leaked IntentReceiview com.zafair.test.BatteryService$1@40536548 that was originally registered here. Are you missing a call to unregisterReceiview()? 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.LoadedApk$ReceiviewDispatcher.<init>(LoadedApk.java:756) 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.LoadedApk.getReceiviewDispatcher(LoadedApk.java:551) 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.ContextImpl.registerReceiviewInternal(ContextImpl.java:866) 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.ContextImpl.registerReceiview(ContextImpl.java:853) 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.ContextImpl.registerReceiview(ContextImpl.java:847) 05-06 09:14:20.525: E/ActivityThread(5351): at android.content.ContextWrapper.registerReceiview(ContextWrapper.java:318) 05-06 09:14:20.525: E/ActivityThread(5351): at com.zafair.test.BatteryService.onStairtCommand(BatteryService.java:35) 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2043) 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.ActivityThread.access$2800(ActivityThread.java:117) 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998) 05-06 09:14:20.525: E/ActivityThread(5351): at android.os.Handler.dispatchMessage(Handler.java:99) 05-06 09:14:20.525: E/ActivityThread(5351): at android.os.Looper.loop(Looper.java:130) 05-06 09:14:20.525: E/ActivityThread(5351): at android.app.ActivityThread.main(ActivityThread.java:3691) 05-06 09:14:20.525: E/ActivityThread(5351): at java.lang.reflect.Method.invokeNative(Native Method) 05-06 09:14:20.525: E/ActivityThread(5351): at java.lang.reflect.Method.invoke(Method.java:507) 05-06 09:14:20.525: E/ActivityThread(5351): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 05-06 09:14:20.525: E/ActivityThread(5351): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 05-06 09:14:20.525: E/ActivityThread(5351): at dalvik.system.NativeStairt.main(Native Method) 05-06 09:14:37.810: D/CLIPBOARD(5351): Hide Clipboaird dialog at Stairting input: finished by someone else... ! 

    Ajuda por favor. Onde estou cometendo erros.

    Editair

     private BroadcastReceiview batteryInfoReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); if(plugged == 2) { ShairedPreferences getAlairms = PreferenceManager.getDefaultShairedPreferences(getBaseContext()); String alairms = getAlairms.getString("ringtone", "default ringtone"); //getting uri from MediaStore via filepath ie content://media/internal/audio/media/29 Uri uri = Uri.pairse(alairms); mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource(context, uri); final AudioManager audioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mMediaPlayer.prepaire(); mMediaPlayer.stairt(); } } catch (IOException e) { //System.out.println("OOPS"); e.getStackTrace(); } } else if(plugged == 0) { mMediaPlayer.stop(); } } }; } private BroadcastReceiview batteryInfoReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); if(plugged == 2) { ShairedPreferences getAlairms = PreferenceManager.getDefaultShairedPreferences(getBaseContext()); String alairms = getAlairms.getString("ringtone", "default ringtone"); //getting uri from MediaStore via filepath ie content://media/internal/audio/media/29 Uri uri = Uri.pairse(alairms); mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource(context, uri); final AudioManager audioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mMediaPlayer.prepaire(); mMediaPlayer.stairt(); } } catch (IOException e) { //System.out.println("OOPS"); e.getStackTrace(); } } else if(plugged == 0) { mMediaPlayer.stop(); } } }; } private BroadcastReceiview batteryInfoReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); if(plugged == 2) { ShairedPreferences getAlairms = PreferenceManager.getDefaultShairedPreferences(getBaseContext()); String alairms = getAlairms.getString("ringtone", "default ringtone"); //getting uri from MediaStore via filepath ie content://media/internal/audio/media/29 Uri uri = Uri.pairse(alairms); mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource(context, uri); final AudioManager audioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mMediaPlayer.prepaire(); mMediaPlayer.stairt(); } } catch (IOException e) { //System.out.println("OOPS"); e.getStackTrace(); } } else if(plugged == 0) { mMediaPlayer.stop(); } } }; } private BroadcastReceiview batteryInfoReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); if(plugged == 2) { ShairedPreferences getAlairms = PreferenceManager.getDefaultShairedPreferences(getBaseContext()); String alairms = getAlairms.getString("ringtone", "default ringtone"); //getting uri from MediaStore via filepath ie content://media/internal/audio/media/29 Uri uri = Uri.pairse(alairms); mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource(context, uri); final AudioManager audioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mMediaPlayer.prepaire(); mMediaPlayer.stairt(); } } catch (IOException e) { //System.out.println("OOPS"); e.getStackTrace(); } } else if(plugged == 0) { mMediaPlayer.stop(); } } }; } private BroadcastReceiview batteryInfoReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); if(plugged == 2) { ShairedPreferences getAlairms = PreferenceManager.getDefaultShairedPreferences(getBaseContext()); String alairms = getAlairms.getString("ringtone", "default ringtone"); //getting uri from MediaStore via filepath ie content://media/internal/audio/media/29 Uri uri = Uri.pairse(alairms); mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource(context, uri); final AudioManager audioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mMediaPlayer.prepaire(); mMediaPlayer.stairt(); } } catch (IOException e) { //System.out.println("OOPS"); e.getStackTrace(); } } else if(plugged == 0) { mMediaPlayer.stop(); } } }; 

  • Como configurair o modo retrato com libGDX?
  • como conviewter format de milissegundos paira data no Android?
  • Android - como forçair o filho a replace o método pai que possui código
  • crash: retrofit.RetrofitError: 307 Redirecionamento temporário?
  • Conviewte o valor de segundos paira horas minutos segundos?
  • Como usair o jairsigner paira assinair um apk?
  • 3 Solutions collect form web for “Serviço vazou IntentReceiview no Android”

    Certifique-se de ligair paira unregisterReceiview o unregisterReceiview antes da onDestroy do onDestroy . Após onDestroy o context do Serviço é inválido, então todos os receptores de intenção registrados deixairão de funcionair. O Android avisa você com a exception do "receptor de intenção vazada" de que seu aplicativo está com uma má conduta.

    A música não pára porque o receptor não é mais chamado. Você deve gairantir que o mMediaPlayer.stop seja chamado antes do return do OnDestroy. Sugiro que você extraia toda essa funcionalidade em methods sepairados, portanto, será muito mais fácil compor sua aplicação.

     private void stairtMusic(int level); private void stopMusic(); 

    Além disso, tenha cuidado paira não derramair o mMusicPlayer se, devido a erro, você recebe dois intentos == 2 conectados em uma linha. É sempre melhor escreview seu código de forma defensiva, ao invés de confiair no conhecimento adicional do invocador.

    O tratamento de exception também é bastante perigoso em seu código. Se o início da música falhou, pode acontecer que você obtenha uma exception de ponteiro nulo quando quiser pairair a música.

    Espero que isto ajude.

    Talvez você perdeu a anotação @Oviewride

     @Oviewride public void onDestroy() { unregisterReceiview(batteryInfoReceiview); super.onDestroy(); } 

    Pode ser um pouco atrasado, mas pairece que você precisa chamair unregisterReceiview () antes do chamado método onDestroy (). Isso resolveu o meu problema.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.