【问题标题】:Accessing main activity in Broadcast Reciever without using intent在不使用意图的情况下访问广播接收器中的主要活动
【发布时间】:2017-05-15 14:43:45
【问题描述】:

我陷入了一个问题。我有一个广播接收器,它调用类的方法,在构造函数中获取上下文和主要活动引用。我不知道如何访问广播接收器中的主要活动。这是我的代码:

public void onReceive(@NonNull Context context, @NonNull Intent intent) {
        if (context == null) {
            throw new IllegalArgumentException();
        }
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();

        if (info != null) {
            if (info.isConnected()) { 
                if (info.getType() == ConnectivityManager.TYPE_WIFI) {
                     Class myclass = new Class(context,mainactivity reference); //dont know how to get main activity here
                }

            }
        }
    }

有没有什么方法可以在没有 Intent 的情况下获得它,或者有其他方法。我处于学习阶段,任何帮助将不胜感激。

在清单中:

<receiver android:name="myreceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver> 

【问题讨论】:

    标签: android android-activity broadcastreceiver main-activity


    【解决方案1】:
    Try this hope it works:
    in Main Activity:
    public class MainActivity extends Activity {
    
    public static MainActivity getInstance() {
        return new MainActivity();
    }
    }
    And in your receiver:
    MainActivity reference=MainActivity.getInstance();
    

    【讨论】:

    • 您提出的方法在我的情况下不会,因为在我的情况下,我正在从“Class”类更新主要活动中的文本视图,在这种情况下它将抛出空指针
    • 那么你必须在初始化 ui 之后在 on create 方法中引用 main Activity..并在 getInstance() 中使用这个引用。
    • 希望它有效:静态 MainActivity ref=null ; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); //// 初始化 ui ref=this; super.onCreate(savedInstanceState); } 公共静态 MainActivity getInstance() { return ref; }
    • 非常感谢。你解决了我的问题。谢谢
    【解决方案2】:

    我不知道如何访问广播接收器中的主要活动

    你没有。如果这是一个清单注册的接收器,那么无论如何您可能没有此活动的实例。

    要么:

    • 通过registerReceiver()Activity内部注册接收器,在这种情况下,您的嵌套BroadcastReceiver类可以引用外部Activity实例,或者

    • 使用事件总线(greenrobot 的 EventBus、LocalBroadcastManager 等)发布您的事件,并让您的活动在该总线上订阅(如果活动恰好在附近)

    【讨论】:

    • 我无法理解您关于注册的第一行。我已经在清单中注册了它,请在帖子中查看我编辑的代码
    • @exceptionnotgood:您的进程不会永远存在。因此,用户从主屏幕启动器启动您的应用程序。然后用户离开您的应用程序。您的进程已终止。然后发生连接变化。此时,您会收到广播(至少在较旧的 Android 设备上),但您没有任何活动。在清单中注册的BroadcastReceiver,就像您一样,不能对流程中可能存在或不存在哪些活动做出任何假设。
    • 感谢您的详细解释。那我现在该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多