2017-04-07 45 views
0

我有一个BroadcastReceiver它检查NetworkChange,无论是否连接到互联网。如何获得调用BroadcastReceiver的活动?

因此,在我的应用程序中,当网络断开或连接时,我想知道哪个活动已调用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))我只是想给这触发此活动。

+0

当你的意思是'哪一个触发了这个',你的意思是发送给你的实体?我不认为你可以。它必须是这样做的系统。 –

回答

1

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

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

这将给当前活动的顶部。

0

做这样的事情在你的活动

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

而在你menifest

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

我有一个BroadcastReceiver其检查NetworkChange,是否连接到互联网或没有。 因此,在我的应用程序中,当网络断开或连接时,我想知道哪个活动调用了BroadcastReceiver,以便在显示通知网络的警报之后,我可以返回到之前的活动。

要获得广播接收器的当前活动使用ActivityManager在广播接收器,以获得活动没有实例

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

要与实例更好地使用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>