6

インテントregisterReceiverを受け取るには、(マニフェストで定義されていない) 呼び出す必要があると言及されている投稿を見てきました。ACTION_BATTERY_LOW

public class MainActivity extends Activity
{

   @Override
   public void onCreate(Bundle savedInstanceState)
   {
       //....  
      registerReceiver(new BatteryLevelReceiver(), new IntentFilter(
                                              Intent.ACTION_BATTERY_LOW));
   }
   // .......
}

ブロードキャストレシーバー

public class BatteryLevelReceiver extends BroadcastReceiver
{
    private static final String TAG = BatteryLevelReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d(TAG, "onReceive");
    }
}

logcat に「onReceive」ログ ステートメントが表示されません。エミュレータを使用して、バッテリの低い状態をシミュレートし、 を使用telnet 5554して実行してpower capacity 10います。エミュレーターでバッテリーの状態が変化しているのがわかりますが、インテントはトリガーされません。

またregisterReceiver()、アクティビティ内で呼び出す必要がありunregisterReceiveronStopまたはonDestroyを呼び出さなくても大丈夫ですか? うまくいかない場合、アプリがフォアグラウンドにない場合でもシステム インテントを受信するようにレシーバーを登録するにはどうすればよいですか? (マニフェストの使用は別として)。

4

4 に答える 4

5

次のことを確認してください。

  1. 「充電器接続」を「なし」に設定しています
  2. そのバッテリーの状態は「放電中」です
于 2016-10-06T13:26:51.097 に答える
2

マニフェストに次のコードを追加できます。

<receiver android:name=".yourpackage.BroadCastNotifier" >
  <intent-filter>
    <action android:name="android.intent.action.BATTERY_LOW" />
  </intent-filter>
</receiver>

あなたのBroadCastNotifier Class

package yourpackage;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BroadCastNotifier extends BroadcastReceiver {
    private final static String TAG = "BroadCastNotifier"; 
    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();

        if(Intent.ACTION_BATTERY_LOW.equalsIgnoreCase(intentAction)){
            Log.e(TAG, "GOT LOW BATTERY WARNING");          
        }
    }

}

GOT LOW BATTERY WARNINGバッテリーが少なくなるとログメッセージが表示されます。デバイスでもこれを試してください。

上記のコードは、そのようなアクションに BroadCast を使用しないことが最善の方法で機能する可能性がありますが、ここで説明されているようにバッテリー レベルを監視できます。以下のコードを使用すると、バッテリーを簡単に判断できます。

int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale; 
于 2013-01-03T05:36:10.673 に答える
1

重要なのは、telnet コマンドで充電を無効にすることです。

power ac off

その後、バッテリーレベルを低容量に設定すると

power capacity 1

インテントがトリガーされます

于 2015-06-29T12:02:12.783 に答える
-1

マニフェストに登録できます-ここでACTION_BATTERY_LOW私の詳細な回答を参照してください-マニフェストに登録することはできません。ACTION_BATTERY_CHANGED

受信しない理由は、マニフェストで RECEIVER を宣言するのを忘れた可能性があります

またregisterReceiver()、アクティビティ内で呼び出す必要がありunregisterReceiveronStopまたはonDestroyを呼び出さなくても大丈夫ですか?

いいえ、常に登録しonResumeて登録を解除する必要があります - 受信者が呼び出されonPauseた後はとにかく受信しませんonPause

うまくいかない場合、アプリがフォアグラウンドにない場合でもシステム インテントを受信するようにレシーバーを登録するにはどうすればよいですか? (マニフェストの使用は別として)。

マニフェストのみ

于 2013-09-22T17:03:22.890 に答える