BroadcastReceiver 和 Activity 之间的通信 - 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);
    }
}

您可以使用观察器,例如

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);
        }
    }
}

接收器可以通过清单使用。可观察对象 - 必须是单例。

这可能会有所帮助:如何从广播接收器通知正在运行的活动?

此外,您可以尝试使用观察器

像这样:

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
    }
}

如果有人需要 BroadcastReceiver 和 Activity 之间的双向通信,我编写了这个实用程序类,它简化了相互调用方法的过程,同时仍然是内存安全的。

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

最新更新