【问题标题】:How to get the activity which called the BroadcastReceiver?如何获取调用 BroadcastReceiver 的活动?
【发布时间】:2017-04-07 04:48:14
【问题描述】:

我有一个BroadcastReceiver,它检查 NetworkChange,是否连接到 Internet。

所以在我的应用程序中,当网络断开或连接时,我想知道哪个活动调用了BroadcastReceiver,这样我就可以在显示有关网络的警报后返回上一个活动。

我的代码,

public class NetworkChangeReceiver extends BroadcastReceiver {

private android.widget.Toast Toast;

@Override
public void onReceive(final Context context, final Intent intent) {
    try {
        boolean isVisible = MyApplication.isActivityVisible();
        Context appContext = context.getApplicationContext();
        if (isVisible == true) {
            if (checkInternet(context)) {
                /*Intent i = new Intent(context, MainActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);*/


                Toast.makeText(context, "Network Available Do operations", Toast.LENGTH_LONG).show();
            } else {
                Intent i = new Intent(context, NoNetworkAlert.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);
                Toast.makeText(context, "Network NOT Available Do operations", Toast.LENGTH_LONG).show();
            }

  .........
  ......

在上面的代码中,当重新连接互联网时, if (checkInternet(context))我只想了解触发此事件的活动。

【问题讨论】:

  • 当您的意思是“触发了这个”时,您的意思是向您发送意图的实体?我不认为你可以。一定是系统在这样做。

标签: android broadcastreceiver android-fragmentactivity


【解决方案1】:

我假设顶部的当前活动是触发NetworkChangeListener 的活动。如果是这样你可以使用下面的代码sn-p,

ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

这将使当前的活动在顶部。

【讨论】:

  • getRunningTasks 不适合以这种方式使用,并且从 Lollipop 开始根本不可用。
【解决方案2】:

在你的活动中做这样的事情

BroadcastReceiver br=new NetworkChangeReceiver ();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        this.registerReceiver(br, filter);

在你的清单中

<receiver
            android:name=".NetworkChangeReceiver "
            android:exported="true">
            <intent-filter>

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

【讨论】:

    【解决方案3】:

    我有一个 BroadcastReceiver 来检查 NetworkChange,无论是否连接到 Internet。

    所以在我的应用程序中,当网络断开或连接时,我想知道哪个活动调用了广播接收器,以便在显示通知网络的警报后返回到以前的活动。

    要在广播接收器中获取当前活动,请使用广播接收器中的 ActivityManager 来获取没有实例的活动

    ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
    ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
    Log.i("ActivityManager ", "ActivityManager" + cn.toString());
    

    要在带有实例的首选 Activity 中获取 Activity,最好使用 Getter 和 Setter。

    MyApplication.Java:

    public class MyApplication extends Application {
       private Activity mCurrentActivity = null;
       // Gloabl declaration of variable to use in whole app
       public static boolean activityVisible; // Variable that will check the
                                     // current activity state
       public static boolean isActivityVisible() {
          return activityVisible; // return true or false
       }
       public static void activityResumed() {
          activityVisible = true;// this will set true when activity resumed
       }
       public static void activityPaused() {
          activityVisible = false;// this will set false when activity paused
       }
       public Activity getCurrentActivity(){
          return mCurrentActivity;
       }
       public void setCurrentActivity(Activity mCurrentActivity){
          this.mCurrentActivity = mCurrentActivity;
       }
    }
    

    MainActivity.Java:

    public class MainActivity extends AppCompatActivity {
        private static TextView internetStatus;
        protected MyApplication mMyApp;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mMyApp = (MyApplication) this.getApplicationContext();
            internetStatus = (TextView) findViewById(R.id.internet_status);
            // At activity startup we manually check the internet status and change
            // the text status
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isConnected()) {
                changeTextStatus(true);
            } else {
                changeTextStatus(false);
            }
        }
        // Method to change the text status
        public void changeTextStatus(boolean isConnected) {
            // Change status according to boolean value
            if (isConnected) {
                internetStatus.setText("Internet Connected.");
                internetStatus.setTextColor(Color.parseColor("#00ff00"));
            } else {
                internetStatus.setText("Internet Disconnected.");
                internetStatus.setTextColor(Color.parseColor("#ff0000"));
            }
        }
        @Override
        protected void onPause() {
            super.onPause();
            MyApplication.activityPaused();// On Pause notify the Application
            clearReferences();
        }
        @Override
        protected void onResume() {
            super.onResume();
            MyApplication.activityResumed();// On Resume notify the Application
            mMyApp.setCurrentActivity(this);
        }
        protected void onDestroy() {
            clearReferences();
            super.onDestroy();
        }
        private void clearReferences() {
            Activity currActivity = mMyApp.getCurrentActivity();
            Log.e("Activity", "Activity" + currActivity);
            if (this.equals(currActivity))
                mMyApp.setCurrentActivity(null);
        }
    }
    

    InternetConnector_Receiver.Java:

    public class InternetConnector_Receiver extends BroadcastReceiver {
        public InternetConnector_Receiver() {
        }
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                boolean isVisible = MyApplication.isActivityVisible();
                Log.i("Activity is Visible ", "Is activity visible : " + isVisible);
                ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
                ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
               Log.i("ActivityManager", "Activity Name:" + cn.toString());
                // If it is visible then trigger the task else do nothing
                if (isVisible == true) {
                    ConnectivityManager connectivityManager = (ConnectivityManager) context
                            .getSystemService(Context.CONNECTIVITY_SERVICE);
                    NetworkInfo networkInfo = connectivityManager
                            .getActiveNetworkInfo();
                    // Check internet connection and accrding to state change the
                    // text of activity by calling method
                    if (networkInfo != null && networkInfo.isConnected()) {
                        new MainActivity().changeTextStatus(true);
                    } else {
                        new MainActivity().changeTextStatus(false);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    清单权限:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    
    <application
        android:name="com.internetconnection_demo.MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- Broadcast receiver declaration in manifest file and make sure to enable it -->
        <receiver
            android:name="com.internetconnection_demo.InternetConnector_Receiver"
            android:enabled="true" >
            <intent-filter>
                <!-- Intent filters for broadcast receiver -->
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.wifi.STATE_CHANGE" />
            </intent-filter>
        </receiver>
    </application>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多