1

どちらが良いですか?アクティビティ内またはサービスクラス内でブロードキャストレシーバーをインスタンス化するには、またはBroadcastReceiverを拡張するクラスを作成するには?

以下は、Serviceクラス内でBroadcastReceiverをインスタンス化する例です。

   public BroadcastReceiver receiver = new BroadcastReceiver() {
    private String filename;

    @Override
    public void onReceive(Context context, Intent intent){
        String action = intent.getAction();
        Bundle extras = intent.getExtras();
        filename = extras.getString("AudioPath");
    Toast.makeText(AudioService.this, "the audio file name sent: " + filename , Toast.LENGTH_LONG).show();
    if(action.equals("com.porno.xxx.AudioPlay")){
            selectedAudioPath = audiopath;
            String state = intent.getExtras().getString("stringdata");
            playSong();
            Toast.makeText(AudioService.this, "play audio from service string data "+ state, Toast.LENGTH_LONG).show();

        }
        else if(action.equals("com.porno.xxx.AudioPause")){
            pauseSong();

            selectedAudioPath = audiopath;
            Toast.makeText(AudioService.this, "pause audio from service", Toast.LENGTH_LONG).show();
        }
        else if(action.equals("com.porno.xxx.AudioSelector")){
            Toast.makeText(AudioService.this, "music selector from service", Toast.LENGTH_LONG).show();
            Intent i = new Intent();
            audiopath = intent.getStringExtra("filename");
            Toast.makeText(AudioService.this, "selelcted audio path: " + audiopath, Toast.LENGTH_LONG).show();
        }
        else if(action.equals("com.porno.xxx.AudioRelease")){
            Toast.makeText(AudioService.this, "My Service Stopped and destoryed", Toast.LENGTH_LONG).show();
            player.stop();
            if (player != null) player.release();

                }   

        }

};
4

2 に答える 2

1

まず、放送受信機で何をしたいのかを計画します。次に、最良かつ実行可能なソリューションを分析します。アクティビティ内でブロードキャストレシーバーを登録および登録解除する場合は、ソースコードに問題はありません。

たとえば、アプリケーションが実行されていないときにブロードキャストレシーバーを呼び出す場合(つまり、アプリケーションから出て、強制的に閉じることはありません)。次に、コーディングで放送受信機を登録および登録解除しないでください。そのために、BroadcastReceiverから拡張された別のクラスを作成/実装します。マニフェストファイルで、ブロードキャストレシーバーを追加します。

于 2012-12-11T06:09:45.057 に答える
1

私が入力している間に回答が送信されて受け入れられたので、ここに私がいました。あなたがすでにあなたの回答を見つけてくれてうれしいです!:)

メディアプレーヤーとしての(見かけの)使用に基づいて、プレーヤーをサービス(ユーザーが離れた場合にバックグラウンドで実行し続けることができる)またはアクティビティ(この機能が望ましくない場合)として実装することをお勧めします。アプリに適しています。)

aの一般的な実装はBroadcastReceiver、マニフェストで宣言されたアプリケーションのスタンドアロンコンポーネントとしてのものであり、アプリケーションが強制終了された場合でもブロードキャストを受信できるようにします。ブロードキャストの受信を開始し、処理後に停止します。

代わりに、BroadcastReceiverこれまでに行ったように、を内部クラスとして作成すると有利な場合があります。これは、レシーバーの起動と停止が簡単なため、自分のアクションのみを処理している場合に最適です。

Serviceのメソッドでは、アクションフィルタを作成できますonCreate()。次に、アプリケーションの状態に基づいて、アクションフィルタを簡単に有効または無効にできます。

/* service */

public static final ACTION_PAUSE = "com.example.action_pause";

@Override
public void onCreate() {
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_ON); /* Android action example */
    filter.addAction(MyClass.ACTION_PAUSE); /* Custom action example*/
    registerReceiver(mIntentReceiver, filter);
}

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v(TAG, "mIntentReceiver.onReceive() action:"+ intent.getAction() );
        handleCommand(intent);
    } // end onReceive
}; /* end BroadcastReceiver */
于 2012-12-11T07:06:13.230 に答える