2016-04-28 9 views
0

バッテリーインジケータに関するアプリケーションを構築していますが、この記事のコードを使用しています。アプリがフォアグラウンドまたはアクティブになっても放送受信機が動作しない

Getting battery status even when the application is closed

アプリを閉じたときに、それが正常に動作しているが、アプリがアクティブであるか、フォアグラウンドで、それは動作しませんでしたか、いずれかのブロードキャストを送信しなかったとき。

これは私がサービスコードである次のサービス

public class Main extends Activity { 

private MyService service; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    if (service == null) { 

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

    finish(); 
} 

}

を開始からの主な活動です。

public class MyService extends Service{ 

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

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.d("MyService", "onStartCommand"); 
    // do not receive all available system information (it is a filter!) 
    final IntentFilter battChangeFilter = new IntentFilter(
      Intent.ACTION_BATTERY_CHANGED); 
    // register our receiver 
    this.registerReceiver(this.batteryChangeReceiver, battChangeFilter); 
    return super.onStartCommand(intent, flags, startId); 
} 
private final BroadcastReceiver batteryChangeReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     checkBatteryLevel(intent); 
    } 
}; 

private void checkBatteryLevel(Intent batteryChangeIntent) { 
    // some calculations 
    final int currLevel = batteryChangeIntent.getIntExtra(
      BatteryManager.EXTRA_LEVEL, -1); 
    final int maxLevel = batteryChangeIntent.getIntExtra(
      BatteryManager.EXTRA_SCALE, -1); 
    final int percentage = (int) Math.round((currLevel * 100.0)/maxLevel); 

    if(percentage==100) 
    { 
     Intent intent = new Intent(getBaseContext(), Last.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     getApplication().startActivity(intent); 

    } 
    // do not forget to unregister 
    unregisterReceiver(batteryChangeReceiver); 
} } 

アクティビティの開始時にブロードキャストを受信できませんでした。私が理解できるように

public class Last extends Activity { 
Button btnCancel; 
Uri notification; 
Ringtone r; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_last); 

    notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
    r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
    r.play(); 


    btnCancel = (Button) findViewById(R.id.stopsound); 

    btnCancel.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      r.stop(); 
     } 
    }); 

} } 
+0

この行を呼び出したので、unregisterReceiver(batteryChangeReceiver);あなたの活動を開始した後。 –

+0

ですが、アプリが終了しても正常に動作します。 – user1999284

+0

あなたのサービスクラスから読み取ったものから、バッテリレベルが100%であれば、最後のアクティビティが開始され、すべてのブロードキャストレシーバが停止(登録解除)されます。最後のアクティビティが開かれたときに、ブロードキャストはもはや –

答えて

0

、 あなたが初めてでアプリケーションを起動したとき、あなたは何を見ていない、ただサービスが開始され、放送受信機が登録されています。バッテリーレベルが変更されると、メソッドcheckBatteryLevel()が呼び出され、ブロードキャストレシーバーは登録解除されます。結果として、新しい電池レベルの変更を受けたことはありません。

+0

私はunregisterReceiverを決して呼び出してはいけませんか? – user1999284

+0

@ user1999284あなたはアクションのリッスンを停止したいときは、unregisterReceiverを呼び出す必要があります。たとえば、サービスが破棄されるときにunregisterReceiverを呼び出すことができます。 – Alexander

+0

私は未登録の受信者の場合、どうすれば再登録できますか? – user1999284

関連する問題