广播接收器和活动之间的交流 - 安卓 [英] Communication between BroadcastReceiver and Activity - android

查看:212
本文介绍了广播接收器和活动之间的交流 - 安卓的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序的广播接收器,触发每个用户得到一个来电的时间。现在,当它发生时,我所需要的广播接收机中的比活性来调用的具体方法。现在,我试图使这种方法静态,因此可用的,但东西告诉我这是一个非常糟糕的主意。

因此​​,我想我的实例里面活动的广播接收器没有在我的清单声明,但问题是 - 当应用程序关闭时,该活动是不存在的,所以我不能调用我的方法。

所以我的问题是 - ?我怎样才能调用此方法时,广播接收装置,解雇了,没有使它公共静态

下面是我的活动code(我已删除了部分无关)

 包com.silverfix.ringo.activities;进口com.silverfix.ringo.R;
进口com.silverfix.ringo.activities.fragments.DataManagerFragment;进口android.app.ActionBar;
进口android.app.Activity;
进口android.app.FragmentTransaction;
进口android.content.BroadcastReceiver;
进口android.content.Context;
进口android.content.Intent;
进口android.content.IntentFilter;公共类RingtonesActivity延伸活动{    私人DataManagerFragment dataManagerFragment;
    私人IntentFilter的过滤器;
    私人广播接收器phoneCall;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_ringtones);
        动作条AB = getActionBar();
        ab.setDisplayShowTitleEnabled(假);
        ab.setDisplayHomeAsUpEnabled(真);
        dataManagerFragment =新DataManagerFragment();
        FragmentTransaction英尺= getFragmentManager()调用BeginTransaction()。
        ft.add(dataManagerFragmentDataManagerFragment);
        ft.commit();
        过滤器=新的IntentFilter();
        filter.addAction(android.intent.action.PHONE_STATE);
        phoneCall =新的广播接收器(){            @覆盖
            公共无效的onReceive(上下文的背景下,意图意图){
                dataManagerFragment.act();
            }
        };
        registerReceiver(phoneCall,过滤器);
    }
}


解决方案

这可能会帮助:<一href=\"http://stackoverflow.com/questions/3122564/how-can-i-notify-a-running-activity-from-a-broadcast-receiver\">how我可以从广播接收器通知运行的活动?

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

是这样的:

 公共类BroadcastObserver扩展观测{
    私人无效triggerObservers(){
        setChanged();
        notifyObservers();
    }    公共无效的变化(){
        triggerObservers();
    }
}

在您的广播接收器:

  @覆盖
公共无效的onReceive(上下文的背景下,意图意图){
    BroadcastObserver BCO =新BroadcastObserver();
    bco.change();
}

和活动:

 公共类YourActivity扩展活动器具
        观察{
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        BroadcastObserver BCO =新BroadcastObserver();
        bco.addObserver(本);
    }    @覆盖
    公共无效更新(){
        // TODO:打电话给你想要的功能
    }
}

I have a broadcast receiver in my app which is fired every time the user gets an incoming call. Now, when it happens, I need the broadcast receiver to invoke a specific method in a specific activity. Now, I tried to make this method static and therefore available, but something tells me it is a very bad idea.

Accordingly, I tried to instantiate the broadcast receiver inside my activity without declaring it in my manifest but the problem is - when the app is off, the activity is not exist and therefore I can't invoke my method.

So my question is - How can I invoke this method when the broadcast receiver is fired up, without making it "public static"?

Here is my activity code(I have deleted the irrelevant parts)

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

解决方案

This might help: how can I notify a running activity from a broadcast receiver?

Also, you can try using Observers

Something like:

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

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

In your broadcast receiver:

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

and the Activity:

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

这篇关于广播接收器和活动之间的交流 - 安卓的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆