5

Intent.ACTION_BATTERY_CHANGED がブロードキャストされるたびに Broadcastreceiver が呼び出されるようにして、データを追跡できるようにします。

私が今持っているもの:

public class ReceiverApplication extends Application {

    @Override
    public void onCreate() {
        // Register Receiver
    }
    public static BroadcastReceiver myReceiver = new BroadcastReceiver()  {

        @Override
        public void onReceive(Context context, Intent intent) {
            // Start Service to progress data
        }       
    };  
}

これは、最近のアプリ「タスクマネージャー」を使用して、好みの画面または主なアクティビティの1つをスワイプするまでは正常に機能します。その後、BroadcastReceiver はもう呼び出されません。アクティビティの 1 つを開始すると、ReceiverApplication の onCreate() が呼び出され、再び機能し始めます。

空のサービスを常に実行することで、これを回避できます。アクティビティをスワイプしてもサービスが強制終了されないようで、しばらくすると onCreate() が呼び出され、何もせずに BroadcastReceiver が再起動されます。ここでの問題は、サービスを常に実行したくないということです。

では、ユーザーが望む限りブロードキャストを受信できるアクティビティまたはサービスの外部でブロードキャストレシーバーを取得するにはどうすればよいですか?

4

3 に答える 3

2

Intent.ACTION_BATTERY_CHANGEDがブロードキャストされるたびにBroadcastreceiverが呼び出されるようにして、データを追跡できるようにします。

この放送はたくさん送られるかもしれません。したがって、Androidは実行中のアプリケーションのみがこのブロードキャストを受信できるようにするため、一連のアプリに「バッテリーレベルが変更されました」と伝えるためだけに一連のプロセスをフォークする必要はありません。

これは、最近のアプリの「タスクマネージャー」を使用して、好みの画面の1つまたはメインのアクティビティをスワイプするまでは正常に機能します。その後、BroadcastReceiverは呼び出されなくなります。

その行為はあなたのプロセスを終了させます。

では、ユーザーが望む限りブロードキャストを受信できるアクティビティまたはサービスの外部でブロードキャストレシーバーを取得するにはどうすればよいですか?

通常、マニフェストでブロードキャストに登録します。の場合ACTION_BATTERY_CHANGED、これは不可能です。

ポーリング できることを覚えておいてください-実際ACTION_BATTERY_CHANGEDに呼び出す代わりに、を渡してください。の戻り値は最後になります。したがって、数分ごとにバッテリーレベルを見つけることができる場合は、を使用して頻繁にウェイクアップし、現在のバッテリーレベルを確認してください。registerReceiver()BroadcastReceivernullregisterReceiver() ACTION_BATTERY_CHANGED IntentAlarmManager

于 2012-09-17T20:41:13.317 に答える
0

ブロードキャスト レシーバーをネストして動的に登録する代わりに、Android マニフェストで宣言しますドキュメントによると、マニフェストで BATTERY_CHANGED を宣言することはできません。

Context.registerReceiver() で明示的に登録するだけで、マニフェストで宣言されたコンポーネントを介してこれを受け取ることはできません。マニフェスト レシーバーを介して送信および受信できる個別のバッテリー関連ブロードキャストについては、ACTION_BATTERY_LOW、ACTION_BATTERY_OKAY、ACTION_POWER_CONNECTED、および ACTION_POWER_DISCONNECTED を参照してください。

これらすべてのイベントを受信するブロードキャスト レシーバーを登録します。

    <receiver
        android:name="MyBroadcastReceiver">
        <intent-filter>
            <action
                android:name="android.intent.action.BATTERY_LOW" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.BATTERY_OKAY" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

アプリが実行されているかどうかに関係なく、ブロードキャスト レシーバーに通知されます。

于 2012-09-17T19:49:45.487 に答える
0

既に作成された回答に加えて、タスク マネージャーで「スワイプ」すると、アプリが正常に動作しなくなるのが普通です。ユーザーが要求するため、タスクマネージャーはそれを停止します。

アクティビティのライフサイクルを止めたくない場合は、やめてください... アプリケーションは onPause() メソッドを呼び出し、必要に応じて他のメソッドを呼び出します。アプリケーションを実際に使用しないでください。タスク マネージャーは、アプリとすべての「関連する」スレッドを強制終了します。

アクティビティのライフ サイクルに関する詳細が必要な場合は、公式ドキュメントをご覧ください: http://developer.android.com/reference/android/app/Activity.html

于 2012-09-17T20:31:27.990 に答える