web-dev-qa-db-ja.com

BroadcastReceiverとアクティビティ間の通信-android

アプリにブロードキャストレシーバーがあり、ユーザーが着信するたびに起動されます。さて、それが発生した場合、ブロードキャストレシーバーが特定のアクティビティの特定のメソッドを呼び出す必要があります。今、私はこのメソッドを静的にして利用できるようにしようとしましたが、何かがそれが非常に悪い考えであることを私に伝えます。

したがって、マニフェストで宣言することなく、アクティビティ内でブロードキャストレシーバーをインスタンス化しようとしましたが、問題は-アプリがオフの場合、アクティビティが存在しないため、メソッドを呼び出せないことです。

だから私の質問は-ブロードキャストレシーバーが起動したときに、「パブリックスタティック」にせずにこのメソッドを呼び出すにはどうすればよいですか?

これが私の活動コードです(私は無関係な部分を削除しました)

package com.silverfix.ringo.activities;

import com.silverfix.ringo.R;
import com.silverfix.ringo.activities.fragments.DataManagerFragment;

import Android.app.ActionBar;
import Android.app.Activity;
import Android.app.FragmentTransaction;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.IntentFilter;

public class RingtonesActivity extends Activity{

    private DataManagerFragment dataManagerFragment;
    private IntentFilter filter;
    private BroadcastReceiver phoneCall;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ringtones);
        ActionBar ab = getActionBar();
        ab.setDisplayShowTitleEnabled(false);
        ab.setDisplayHomeAsUpEnabled(true);
        dataManagerFragment = new DataManagerFragment();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.add(dataManagerFragment, "DataManagerFragment");
        ft.commit();
        filter = new IntentFilter();
        filter.addAction("Android.intent.action.PHONE_STATE");
        phoneCall = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                dataManagerFragment.act();
            }
        };
        registerReceiver(phoneCall, filter);
    }
}
22
David Lasry

あなたはオブザーバーを使うことができます

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        ObservableObject.getInstance().updateValue(intent);
    }
}

public class MainActivity extends Activity implements Observer {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ObservableObject.getInstance().addObserver(this);
    }

    @Override
    public void update(Observable observable, Object data) {            
        Toast.makeText(this, String.valueOf("activity observer " + data), Toast.LENGTH_SHORT).show();
    }
}

public class ObservableObject extends Observable {
    private static ObservableObject instance = new ObservableObject();

    public static ObservableObject getInstance() {
        return instance;
    }

    private ObservableObject() {
    }

    public void updateValue(Object data) {
        synchronized (this) {
            setChanged();
            notifyObservers(data);
        }
    }
}

レシーバーはマニフェストを介して使用できます。 ObservableObject-シングルトンである必要があります。

52
ilw

これは役立つかもしれません: 放送レシーバーから実行中のアクティビティをどのように通知できますか?

また、 Observers を使用して試すこともできます

何かのようなもの:

public class BroadcastObserver extends Observable {
    private void triggerObservers() {
        setChanged();
        notifyObservers();
    }

    public void change() {
        triggerObservers();
    }
}

放送受信機で:

@Override
public void onReceive(Context context, Intent intent) {
    BroadcastObserver bco = new BroadcastObserver();
    bco.change();
}

と活動:

public class YourActivity extends Activity implements
        Observer {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BroadcastObserver bco = new BroadcastObserver();
        bco.addObserver(this);
    }

    @Override
    public void update() {
        //TODO: call your desired function
    }
}
6
Archie.bpgc

BroadcastReceiverとActivityの間の双方向通信が必要な場合は、このユーティリティクラスを作成して、メモリセーフでありながら、お互いのメソッドの呼び出しを簡略化しました。

https://Gist.github.com/Jenjen1324/4a0c03beff827082cb641fc8fe2c4e71

0
JensV