广播实践——强制下线功能

新建一个 BroadcastBestPractice 项目
创建一个 ActivityCollector 类用于管理所有的活动,代码如下所示:
public class ActivityCollector { 
 public static List<Activity> activities = new ArrayList<>(); 
 public static void addActivity(Activity activity) { 
 activities.add(activity); 
 } 
 public static void removeActivity(Activity activity) { 
 activities.remove(activity); 
 } 
 public static void finishAll() { 
 for (Activity activity : activities) { 
 if (!activity.isFinishing()) { 
 activity.finish();
 } 
 } 
 activities.clear(); 
 } 
}
然后创建 BaseActivity 类作为所有活动的父类,代码如下所示:
public class BaseActivity extends AppCompatActivity { 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 ActivityCollector.addActivity(this); 
 } 
 @Override 
 protected void onDestroy() { 
 super.onDestroy(); 
 ActivityCollector.removeActivity(this); 
 } 
}

接着新建 LoginActivity类,让Android Studio 帮我们自动生成相应的布局文件,编辑布局文件 activity_login.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent"> 
 
 <LinearLayout 
 android:orientation="horizontal" 
 android:layout_width="match_parent" 
 android:layout_height="60dp"> 
 <TextView 
 android:layout_width="90dp" 
 android:layout_height="wrap_content" 
 android:layout_gravity="center_vertical" 
 android:textSize="18sp" 
 android:text="Account:" /> 
 <EditText 
 android:id="@+id/account" 
 android:layout_width="0dp" 
 android:layout_height="wrap_content" 
 android:layout_weight="1" 
 android:layout_gravity="center_vertical" /> 
 </LinearLayout> 
 <LinearLayout 
 android:orientation="horizontal"
android:layout_width="match_parent" 
 android:layout_height="60dp"> 
 <TextView 
 android:layout_width="90dp" 
 android:layout_height="wrap_content" 
 android:layout_gravity="center_vertical" 
 android:textSize="18sp" 
 android:text="Password:" /> 
 <EditText 
 android:id="@+id/password" 
 android:layout_width="0dp" 
 android:layout_height="wrap_content" 
 android:layout_weight="1" 
 android:layout_gravity="center_vertical" 
 android:inputType="textPassword" /> 
 </LinearLayout> 
 <Button 
 android:id="@+id/login" 
 android:layout_width="match_parent" 
 android:layout_height="60dp" 
 android:text="Login" /> 
</LinearLayout>
接下来修改 LoginActivity 中的代码,如下所示:
public class LoginActivity extends BaseActivity { 
 private EditText accountEdit; 
 private EditText passwordEdit; 
 private Button login; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_login); 
 accountEdit = (EditText) findViewById(R.id.account); 
 passwordEdit = (EditText) findViewById(R.id.password); 
 login = (Button) findViewById(R.id.login); 
 login.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 String account = accountEdit.getText().toString();
String password = passwordEdit.getText().toString(); 
 // 如果账号是 admin 且密码是 123456,就认为登录成功
 if (account.equals("admin") && password.equals("123456")) { 
 Intent intent = new Intent(LoginActivity.this, MainActivity. 
 class); 
 startActivity(intent); 
 finish(); 
 } else { 
 Toast.makeText(LoginActivity.this, "account or password is 
 invalid", Toast.LENGTH_SHORT).show(); 
 } 
 } 
 }); 
 } 
 
}

接下来只需要加入强制下线功能就可以了,修改 activity_main.xml 中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" > 
 <Button 
 android:id="@+id/force_offline" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:text="Send force offline broadcast" /> 
</LinearLayout>
然后修改 MainActivity 中的代码:
public class MainActivity extends BaseActivity {
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 Button forceOffline = (Button) findViewById(R.id.force_offline); 
 forceOffline.setOnClickListener(new View.OnClickListener() { 
 @Override
public void onClick(View v) { 
 Intent intent = new Intent("com.example.broadcastbestpractice. 
 FORCE_OFFLINE"); 
 sendBroadcast(intent); 
 } 
 }); 
 } 
 
}
不管是在程序的任何 地方,只需要发出这样一条广播,就可以完成强制下线的操作了。接下来我们就需要创建一个广播接收器来接收这条强制下线广播,我们只需要在 BaseActivity 中动态注册一个广播接收器就可以了,因为所有的活动都是继承自 BaseActivity 的。
修改 BaseActivity 中的代码,如下所示:
public class BaseActivity extends AppCompatActivity { 
 private ForceOfflineReceiver receiver; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 ActivityCollector.addActivity(this); 
 } 
 @Override 
 protected void onResume() { 
 super.onResume(); 
 IntentFilter intentFilter = new IntentFilter(); 
 intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE"); 
 receiver = new ForceOfflineReceiver(); 
 registerReceiver(receiver, intentFilter); 
 } 
 @Override 
 protected void onPause() { 
 super.onPause(); 
 if (receiver != null) { 
 unregisterReceiver(receiver);
 receiver = null; 
 } 
 } 
 @Override 
 protected void onDestroy() { 
 super.onDestroy(); 
 ActivityCollector.removeActivity(this); 
 } 
 class ForceOfflineReceiver extends BroadcastReceiver { 
 @Override 
 public void onReceive(final Context context, Intent intent) { 
 AlertDialog.Builder builder = new AlertDialog.Builder(context); 
 builder.setTitle("Warning"); 
 builder.setMessage("You are forced to be offline. Please try to login 
 again."); 
 builder.setCancelable(false); 
 builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
 @Override 
 public void onClick(DialogInterface dialog, int which) { 
 ActivityCollector.finishAll(); // 销毁所有活动
 Intent i = new Intent(context, LoginActivity.class); 
 context.startActivity(i); // 重新启动 LoginActivity 
 } 
 }); 
 builder.show(); 
 } 
 } 
}

现在所有强制下线的逻辑就已经完成了,接下来我们还需要对 AndroidManifest.xml 文件进行修改,代码如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 package="com.example.broadcastbestpractice"> 
 <application 
 android:allowBackup="true" 
 android:icon="@mipmap/ic_launcher" 
 android:label="@string/app_name" 
 android:supportsRtl="true" 
 android:theme="@style/AppTheme"> 
 <activity android:name=".MainActivity"> 
 </activity> 
 <activity android:name=".LoginActivity"> 
 <intent-filter> 
 <action android:name="android.intent.action.MAIN" /> 
 <category android:name="android.intent.category.LAUNCHER" /> 
 </intent-filter> 
 </activity> 
 </application> 
</manifest>

最后程序运行结果如下:

 不要问为什么没有Remember password了哦,这是密码记住功能,下次再教吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值