2016-04-18 48 views
0

バッテリの充電が満杯になったときに通知としてサウンドを再生します。レシーバクラスがACTION_BATTERY_CHANGEDを​​認識しません

私の受信機のクラス私は「電源が接続されました」と「電源が切断されました」という2つの通知を書きました。

しかし、受信者はACTION_BATTERY_CHANGEDを​​認識しません。私は多くを検索し、プログラムで登録する必要があることを知りました。

問題は、アクティビティなしで登録する必要があることです。私のプログラムが動作しなくても "Battery_Fully_charged"に通知したいからです。

私の受信機( "MyReceiver.class")にこのようなものを登録するにはどうしたらいいですか?

ここに私が見つけたサンプルコードがあります。しかし、私は活動なしでそれをしたい。

public class Main extends Activity { 
    private TextView batteryTxt; 
    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context ctxt, Intent intent) { 
     int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
     batteryTxt.setText(String.valueOf(level) + "%"); 
    } 
    }; 

    @Override 
    public void onCreate(Bundle b) { 
    super.onCreate(b); 
    setContentView(R.layout.main); 
    batteryTxt = (TextView) this.findViewById(R.id.batteryTxt); 
    this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    } 
} 

編集: サービスとBroadcaseレシーバーの違いは何ですか?私は、サービスを試してみましたが、それでもdocumentationから任意の結果

+0

アクティビティの代わりにサービスを使用します。注:Androidはこれのような暗黙の意図を取り除いているので、Android Nでは動作しない可能性があります。 –

+0

@Eugen Pechanecもちろん、私はServiceを使用しましたが、それでも動作しません。いくつかの例を投稿できますか? –

+0

ここに「もちろん」というものはありません。どうすれば知っていますか?あなたが試したことを投稿したら、私たちは繰り返しませんか? –

答えて

0

を取得できませんでした:

あなたが唯一の明示的Context.registerReceiver()でそれのために登録することにより、マニフェストで宣言されたコンポーネントを介してこれを受信することはできません。 [...]

これが意味:

1)のみBroadcastReceiverは、これらのインテントを受け取ることができます。

2)動的に登録された受信者のみがこれらのインテントを受信できます。

あなたは既にのサービスを見てみましょうアクティビティの内側にそれを行う方法を理解する:

public class MyService extends Service { 

    private final IntentFilter batteryIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    private final BroadcastReceiver batteryReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context ctxt, Intent intent) { 
      // React. 
     } 
    }; 

    public void onCreate() { 
     super.onCreate(); 
     registerReceiver(batteryReceiver, batteryIntentFilter); 
    } 

    public void onDestroy() { 
     unregisterReceiver(batteryReceiver); 
     super.onDestroy(); 
    } 

    public int onStartCommand (Intent intent, int flags, int startId) { 
     return START_STICKY; 
    } 
} 

あなたが(「フォアグラウンドサービスを」グーグル)フォアグラウンドにそれを置くことによって殺さサービスの可能性を減らすことができます。

http://developer.android.com/preview/behavior-changes.html#bg-optに記載されているように、いくつかの暗黙的な意図がなくなるため、ACTION_BATTERY_CHANGEDがそれらの間に存在することになります。

+0

あなたの答えをありがとう。私はこのクラスを使用し、タグをManifestこのサービスをどこからでも開始する必要はありませんか? "OnCreate"は自動的に実行されますか? –

+0

ああ、ええ、あなたは 'startService(new Intent(this、MyService。いつでも実行できるようにするには 'Application'をサブクラス化することができますhttp://www.devahead.com/blog/2011/06/extending-the-android-application-シングルトンを扱うクラスと扱い。 –

+0

ありがとう。それは今働く。もう1つの質問。このサービスはいくつかの条件で停止しますか?私はunregisterReceiverを削除して、ACTION_BATTERY_CHANGEDを​​認識し続けました。ただし、私のアプリではサービスの作業は問題ではありません。これはこのように動作しますか?[私はそれを起動するためにアプリケーションを使用しました] –

関連する問題