这是我想要做的:
以下是我的尝试:
Broadcast Receiver
的类。我在所有活动中创建了该类的对象并注册了接收器。我从未取消注册接收器当然给了我一个错误。
Are you missing a call to unregisterReceiver()?
如果我取消注册接收器,它会给我以下错误:
java.lang.IllegalArgumentException: Receiver not registered
// The onCreate function (Just a sample)
onCreate(){
registerReceiver(broadcastReceiver, new IntentFilter("broadCastName"));
}
// Outside OnCreate
NetworkStatus broadcastReceiver = new NetworkStatus() {
@Override
public void onReceive(Context context, Intent intent) {
String message;
Bundle b = intent.getExtras();
message = b.getString(KEY_NET_MESSAGE);
if (message.equals(KEY_NET_DISCONNECTED)){
Toast.makeText(SignupActivity.this, MESSAGE_NET_DISCONNECTED, Toast.LENGTH_SHORT).show();
btnSignup.setEnabled(false);
Network_disconnection.setVisibility(View.VISIBLE);
}
if (message.equals(KEY_NET_CONNECTED)){
btnSignup.setEnabled(true);
Network_disconnection.setVisibility(View.INVISIBLE);
}
}
};
//onStop, just a sample
@Override
protected void onStop() {
unregisterReceiver(broadcastReceiver);
super.onStop();
}
<receiver android:name=".Common.NetworkStatus">
-
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
public class NetworkStatus extends BroadcastReceiver implements Keys.UniversalKeys{
@Override
public void onReceive(Context context, Intent arg1) {
boolean isConnected = arg1.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
if(isConnected){
Intent i = new Intent("broadCastName");
// Data you need to pass to activity
i.putExtra(KEY_NET_MESSAGE, KEY_NET_DISCONNECTED);
context.sendBroadcast(i);
}
else{
Intent i = new Intent("broadCastName");
// Data you need to pass to activity
i.putExtra(KEY_NET_MESSAGE, KEY_NET_CONNECTED);
context.sendBroadcast(i);
Toast.makeText(context, KEY_NET_CONNECTED, Toast.LENGTH_LONG).show();
}
}
}
我做错了什么?有一点我很清楚,也许我不应该在每个活动上创建新的接收器!另外,为什么我需要制作一个额外的java文件?我的意思是为什么我不能在每个活动上创建一个BroadcastReceiver对象并继续使用它?
答案 0 :(得分:2)
当您在AndroidMainfest.XML中注册接收器时,它是静态的。即使应用程序关闭,它也会运行。
当您在JAVA(活动)中注册接收器时,它是动态的,可以通过动态编码进行注册和注销。
使用以下代码创建一个SampleActivity.java类:
public class SampleActivity extends AppCompatActivity {
// Declare BroadcastReceiver and RelativeLayout
BroadcastReceiver breceiver;
RelativeLayout NoNetBar;
@Override
protected void onResume() {
Toast.makeText(SampleActivity.this, "App has Resumed", Toast.LENGTH_SHORT).show();
// Register your receiver upon resume.
registerReceiver(breceiver, new IntentFilter("broadCastName"));
Toast.makeText(SampleActivity.this, "Broadcast Registered", Toast.LENGTH_SHORT).show();
super.onResume();
}
public void setRelative(RelativeLayout param_bar) {
Toast.makeText(SampleActivity.this, "NoNetBar has been setup", Toast.LENGTH_SHORT).show();
// This will set RelativeLayout to your desired RelativeLayout from your main activity
NoNetBar = param_bar;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
// Call super oncreate and then set RelativeLayout to invisible initially
super.onCreate(savedInstanceState);
NoNetBar.setVisibility(View.INVISIBLE);
// Initialize broadcast receiver
breceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean isConnected = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
if (isConnected){
NoNetBar.setVisibility(View.VISIBLE);
} else if (!isConnected){
NoNetBar.setVisibility(View.INVISIBLE);
}
}
};
Toast.makeText(SampleActivity.this, "Broadcast Initialized", Toast.LENGTH_SHORT).show();
Toast.makeText(SampleActivity.this, "App is Created", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
Toast.makeText(SampleActivity.this, "App has Paused", Toast.LENGTH_SHORT).show();
// Unregister your receiver
unregisterReceiver(breceiver);
Toast.makeText(SampleActivity.this, "Broadcast UnRegistered", Toast.LENGTH_SHORT).show();
}
}
此类扩展了AppCompatActivity(像往常一样)。您可以使用此类创建活动,只要您希望接收器处理一些例外情况。
在以下其他活动中使用此课程:
public class MainActivity extends SampleActivity {
Button btnNext;
RelativeLayout Network_disconnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Make sure that you can setRelative before calling super.onCreate or you will get a NULL POINTER EXCEPTION
setRelative(Network_disconnection);
Toast.makeText(MainActivity.this, "Now Calling Supper", Toast.LENGTH_SHORT).show();
super.onCreate(savedInstanceState);
}
}
您可以查看此链接以了解活动生命周期:
https://developer.android.com/training/basics/activity-lifecycle/starting.html
或者如果赶时间,请检查此图片: