Android使用廣播(BroadCast)實(shí)現(xiàn)強(qiáng)制下線的方法
本文實(shí)例講述了Android使用廣播(BroadCast)實(shí)現(xiàn)強(qiáng)制下線的方法。分享給大家供大家參考,具體如下:
使用廣播簡(jiǎn)單模擬強(qiáng)制下線功能。
1、新建活動(dòng)管理類
新建Activity活動(dòng)管理類,方便管理所有活動(dòng)。
package com.example.broadcastpractice; import java.util.ArrayList; import java.util.List; import android.app.Activity; /** * 所有活動(dòng)管理器 * @author yy * */ public class ActivityCollector { public static List<Activity> activities = new ArrayList<Activity>(); /** * 添加活動(dòng) * @param activity */ public static void addActivity(Activity activity){ if(!activities.contains(activity)){ activities.add(activity); } } /** * 移除活動(dòng) * @param activity */ public static void removeActivity(Activity activity){ activities.remove(activity); } /** * 結(jié)束所有活動(dòng) */ public static void finishAll(){ for(Activity activity : activities){ if(!activity.isFinishing()){ activity.finish(); } } } }
2、新建活動(dòng)基類
用于管理Activity。
package com.example.broadcastpractice; import android.app.Activity; import android.os.Bundle; /** * 所有活動(dòng)的基類 * @author yy * */ public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //每創(chuàng)建一個(gè)活動(dòng),就加入到活動(dòng)管理器中 ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); //每銷毀一個(gè)活動(dòng),就從活動(dòng)管理器中移除 ActivityCollector.removeActivity(this); } }
3、新建登陸布局
新建登陸布局login.xml,如下:
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:stretchColumns="1" > <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Account:" /> <EditText android:id="@+id/account" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="Input your account here" android:ems="10" > </EditText> </TableRow> <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Password:" /> <EditText android:id="@+id/password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:inputType="textPassword" > </EditText> </TableRow> <TableRow android:id="@+id/tableRow3" android:layout_width="wrap_content" android:layout_height="wrap_content" > <Button android:id="@+id/login" android:layout_span="2" android:layout_height="wrap_content" android:text="Login" /> </TableRow> </TableLayout>
使用的是TableLayout,當(dāng)然也可以使用其他布局,在該布局中,定義了登陸等相關(guān)信息。
4、新建登陸布局對(duì)應(yīng)的Activity
新建登陸布局對(duì)應(yīng)的Activity類,用于加載登陸布局:
package com.example.broadcastpractice; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class LoginActivity extends BaseActivity { private EditText accountEdit; private EditText passwordEdit; private Button loginButton; @Override protected void onCreate(Bundle savedInstanceState) { //首先調(diào)用父類的方法 super.onCreate(savedInstanceState); //加載登陸布局 setContentView(R.layout.login); //獲取輸入內(nèi)容 accountEdit = (EditText) findViewById(R.id.account); passwordEdit = (EditText) findViewById(R.id.password); loginButton = (Button) findViewById(R.id.login); //注冊(cè)按鈕點(diǎn)擊事件 loginButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String account = accountEdit.getText().toString(); String password = passwordEdit.getText().toString(); if(account.equals("yy") && password.equals("123456")){ //登陸成功 //啟用MainActivity活動(dòng) Intent intent = new Intent(LoginActivity.this,MainActivity.class); //啟動(dòng) startActivity(intent); //當(dāng)前活動(dòng)銷毀 finish(); }else{ //登陸失敗 //清空內(nèi)容 accountEdit.setText(""); passwordEdit.setText(""); Toast.makeText(LoginActivity.this, "登陸失敗,請(qǐng)重新登陸??!", Toast.LENGTH_SHORT).show(); } } }); } }
在登陸按鈕的監(jiān)聽事件中,當(dāng)?shù)顷戲?yàn)證通過,新新一個(gè)活動(dòng)MainActivity,同時(shí)銷毀當(dāng)前活動(dòng),如果登陸失敗,則清空所填內(nèi)容。
5、MainActivity
package com.example.broadcastpractice; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /** * 繼承BaseActivity * @author yy * */ 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); //注冊(cè)事件 forceOffline.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //啟用廣播 Intent intent = new Intent("com.example.broadcastpractice.FORCE_OFFLINE"); //發(fā)送廣播--標(biāo)準(zhǔn)廣播 sendBroadcast(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
下面是MainActivity對(duì)應(yīng)的布局文件activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/force_offline" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="強(qiáng)制下線" /> </LinearLayout>
即在該布局中有一按鈕,當(dāng)點(diǎn)擊時(shí),發(fā)送強(qiáng)制下線的廣播,當(dāng)然了我們接下來要?jiǎng)?chuàng)建廣播接收器:
6、廣播接收器
package com.example.broadcastpractice; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.view.WindowManager; /** * 強(qiáng)制下線廣播接收器 * @author yy * */ public class ForceOfflineBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { //對(duì)話框 AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("警告"); //正文 builder.setMessage("你已被強(qiáng)制下線,請(qǐng)重新登陸。"); //不可取消 builder.setCancelable(false); //按鈕 builder.setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //銷毀所有活動(dòng) ActivityCollector.finishAll(); //啟動(dòng)登陸活動(dòng) Intent intent = new Intent(context,LoginActivity.class); //在廣播中啟動(dòng)活動(dòng),需要添加如下代碼 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }); AlertDialog alterDialog = builder.create(); //添加對(duì)話框類型:保證在廣播中正常彈出 alterDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); //對(duì)話框展示 alterDialog.show(); } }
7、全集配置文件AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcastpractice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- 登陸活動(dòng)為主活動(dòng) --> <activity android:name="com.example.broadcastpractice.LoginActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- MainActivity活動(dòng) --> <activity android:name=".MainActivity"/> <!-- 廣播接收器 --> <receiver android:name=".ForceOfflineBroadCastReceiver"> <intent-filter> <action android:name="com.example.broadcastpractice.FORCE_OFFLINE"/> </intent-filter> </receiver> </application> </manifest>
8、效果展示
當(dāng)輸入錯(cuò)誤時(shí),驗(yàn)證不通過,顯示上方左圖。當(dāng)輸入正確時(shí),驗(yàn)證通過,進(jìn)入MainActivity界面,點(diǎn)擊按鈕,顯示上方右圖。當(dāng)點(diǎn)擊確定時(shí),會(huì)跳到登陸界面。
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android中BroadcastReceiver(異步接收廣播Intent)的使用
- Android提高之BroadcastReceiver實(shí)例詳解
- 深入Android中BroadcastReceiver的兩種注冊(cè)方式(靜態(tài)和動(dòng)態(tài))詳解
- Android編程四大組件之BroadcastReceiver(廣播接收者)用法實(shí)例
- Android中的廣播(BroadCast)詳細(xì)介紹
- Android查看電池電量的方法(基于BroadcastReceiver)
- Android實(shí)現(xiàn)Activity、Service與Broadcaster三大組件之間互相調(diào)用的方法詳解
- Android開發(fā)之BroadcastReceiver用法實(shí)例分析
- Android基礎(chǔ)知識(shí)之broadcast廣播詳解
- Android學(xué)習(xí)之Broadcast的簡(jiǎn)單使用
相關(guān)文章
關(guān)于gradle你應(yīng)該知道的一些小事
這篇文章主要給大家介紹了關(guān)于gradle你應(yīng)該知道的一些小事,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用gradle具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10Android編程實(shí)現(xiàn)自定義分享列表ACTION_SEND功能的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義分享列表ACTION_SEND功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了自定義分享列表功能的步驟與具體操作技巧,需要的朋友可以參考下2017-02-02Android實(shí)現(xiàn)帶節(jié)點(diǎn)的進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶節(jié)點(diǎn)的進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03Android程序開發(fā)之WebView使用總結(jié)
這篇文章主要介紹了Android程序開發(fā)之WebView使用總結(jié)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07Android Handler主線程和一般線程通信的應(yīng)用分析
本篇文章小編為大家介紹,Android Handler主線程和一般線程通信的應(yīng)用分析。需要的朋友參考下2013-04-04TextView使用SpannableString設(shè)置復(fù)合文本 SpannableString實(shí)現(xiàn)TextView的鏈接
這篇文章主要為大家詳細(xì)介紹了如何利用SpannableString實(shí)現(xiàn)TextView的鏈接效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Android獲取熱點(diǎn)主機(jī)ip和連接熱點(diǎn)手機(jī)ip的代碼
這篇文章主要介紹了Android獲取熱點(diǎn)主機(jī)ip和連接熱點(diǎn)手機(jī)ip的相關(guān)資料,需要的朋友可以參考下2018-01-01