四大组件之一Broadcast应用实例
2015-05-20 09:53
337 查看
我们常用的QQ、微信等应用,都会遇到在另外一处登录,然后当前页面就会收到提示下线的弹窗通知,该功能基本思路就是,在另一处登录时,会发出一个广播,当前页面收到广播后执行接收器receiver中的代码,代码中可执行弹出提示、强制下线、跳转到登录界面等一系列操作。
下面就用简单代码实例来实现该功能:
一、先建立一个登录界面:
1.登录的布局文件activity_login.xml
TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Account">
</TextView>
<EditText
android:id="@+id/account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="input your account">
</EditText>
</TableRow>
<TableRow >
<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:hint="input your password"
android:inputType="textPassword"
/>
</TableRow>
<TableRow>
<Button
android:id="@+id/Login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Login"
android:layout_span="2">
</Button>
</TableRow>
</TableLayout>
2.建立一个LoginActivity.java:
package com.example.broadcast_forceoffline;
import com.example.broadcast_forceoffline.R;
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 {
EditText account;
EditText password;
Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
account = (EditText)findViewById(R.id.account);
password = (EditText)findViewById(R.id.password);
login = (Button)findViewById(R.id.Login);
login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String accountString = account.getText().toString();
String passwordString = password.getText().toString();
if(accountString.equals("admin")&&passwordString.equals("12345")){
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}else{
Toast.makeText(LoginActivity.this, "invalid account or password", Toast.LENGTH_LONG).show();
}
}
});
}
}
二.再建立主界面,添加发送广播的button
1.布局文件activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.broadcast_forceoffline.MainActivity" >
<Button
android:id="@+id/sendBroadcast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SendBroadcast" />
</RelativeLayout>
2.主界面MainActivity.java的文件
package com.example.broadcast_forceoffline;
import com.example.broadcast_forceoffline.R;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends BaseActivity {
Button sendBroadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBroadcast = (Button)findViewById(R.id.sendBroadcast);
sendBroadcast.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//创建一个隐式intent对象,传入发送的广播,用sendBroadcast发送intent
Intent intent =new Intent("com.example.broadcast_forceoffline.FORCE_OFFLINE");
sendBroadcast(intent);
}
});
}
}
三.在AndroidManifest中注册广播接收器:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcast_forceoffline"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<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" >
<activity
android:name="com.example.broadcast_forceoffline.MainActivity"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.example.broadcast_forceoffline.LoginActivity"
android:label="@string/title_activity_login" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 接收器需要在androidmanifest中进行注册,通过intent-filter对广播进行过滤,在此过滤只接收com.example.broadcast_forceoffline.FORCE_OFFLINE广播,接收到该广播后执行ForceOfflineReceiver类 -->
<receiver
android:name=".ForceOfflineReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.example.broadcast_forceoffline.FORCE_OFFLINE" />
</intent-filter>
</receiver>
<activity
android:name="com.example.broadcast_forceoffline.BaseActivity"
android:label="@string/title_activity_base" >
</activity>
</application>
</manifest>
四.创建继承自BroadcastReceiver类的ForceOfflineReceiver类,接收到相匹配的广播后即执行该接收器类
package com.example.broadcast_forceoffline;
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;
public class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// 接收到广播后弹出alertdialog对话框,alertdialog对象不能直接创建,需要先创建一个alertdialog.builder对象,然后再通过oncreat()方法创建alertdialog对象
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("warning"); //设置alertdialog的标题
builder.setMessage("you are force to be offline"); // 设置alertdialog的masssage内容
builder.setCancelable(false); //alertdialog不可通过返回取消
builder.setPositiveButton("ok", new OnClickListener() {
//设置确定按钮,第一个参数表示确定按钮的文字内容,第二个参数是监听行为,点击后执行如下onClick()内容
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
//将TASK任务栈中的activity全部finish掉,然后重启login界面
ActivityCollector.finishAll();
Intent intent = new Intent(context,LoginActivity.class);
//通过addflags方法给intent添加一个TASK,将重启的loginactivity放入TASK中显示
//此处可能会有疑问,为什么用intent进行两个activity进行跳转的时候不需要添加addflags,因为默认情况下flags是被跳转activity所在TASK,而此处我们是从BroadcastReceiver的上下文中跳转到activity的,接收器是不存在TASK中的,此时没有TASK,所以需要新建立一个TASK。
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
//alertdialog在BroadcastReceiver中没有父类window,需要设置系统window显示弹窗
AlertDialog alertDialog = builder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
五.创建ActivityCollector类和BaseActivity类,目的是在接收器中能实现对TASK中的所有activity进行finish,该应用的所有activity类都必须继承BaseActivity,而不是activity
1.ActivityCollector类:
package com.example.broadcast_forceoffline;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>();
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();
}
}
}
}
2. BaseActivity类,继承ActivityCollector类
package com.example.broadcast_forceoffline;
import com.example.broadcast_forceoffline.R;
import android.app.Activity;
import android.os.Bundle;
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
ActivityCollector.addActivity(this);
}
protected void onDestroy(){
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
六.运行程序
下面就用简单代码实例来实现该功能:
一、先建立一个登录界面:
1.登录的布局文件activity_login.xml
TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Account">
</TextView>
<EditText
android:id="@+id/account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="input your account">
</EditText>
</TableRow>
<TableRow >
<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:hint="input your password"
android:inputType="textPassword"
/>
</TableRow>
<TableRow>
<Button
android:id="@+id/Login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Login"
android:layout_span="2">
</Button>
</TableRow>
</TableLayout>
2.建立一个LoginActivity.java:
package com.example.broadcast_forceoffline;
import com.example.broadcast_forceoffline.R;
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 {
EditText account;
EditText password;
Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
account = (EditText)findViewById(R.id.account);
password = (EditText)findViewById(R.id.password);
login = (Button)findViewById(R.id.Login);
login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String accountString = account.getText().toString();
String passwordString = password.getText().toString();
if(accountString.equals("admin")&&passwordString.equals("12345")){
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}else{
Toast.makeText(LoginActivity.this, "invalid account or password", Toast.LENGTH_LONG).show();
}
}
});
}
}
二.再建立主界面,添加发送广播的button
1.布局文件activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.broadcast_forceoffline.MainActivity" >
<Button
android:id="@+id/sendBroadcast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SendBroadcast" />
</RelativeLayout>
2.主界面MainActivity.java的文件
package com.example.broadcast_forceoffline;
import com.example.broadcast_forceoffline.R;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends BaseActivity {
Button sendBroadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBroadcast = (Button)findViewById(R.id.sendBroadcast);
sendBroadcast.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//创建一个隐式intent对象,传入发送的广播,用sendBroadcast发送intent
Intent intent =new Intent("com.example.broadcast_forceoffline.FORCE_OFFLINE");
sendBroadcast(intent);
}
});
}
}
三.在AndroidManifest中注册广播接收器:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcast_forceoffline"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<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" >
<activity
android:name="com.example.broadcast_forceoffline.MainActivity"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.example.broadcast_forceoffline.LoginActivity"
android:label="@string/title_activity_login" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 接收器需要在androidmanifest中进行注册,通过intent-filter对广播进行过滤,在此过滤只接收com.example.broadcast_forceoffline.FORCE_OFFLINE广播,接收到该广播后执行ForceOfflineReceiver类 -->
<receiver
android:name=".ForceOfflineReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.example.broadcast_forceoffline.FORCE_OFFLINE" />
</intent-filter>
</receiver>
<activity
android:name="com.example.broadcast_forceoffline.BaseActivity"
android:label="@string/title_activity_base" >
</activity>
</application>
</manifest>
四.创建继承自BroadcastReceiver类的ForceOfflineReceiver类,接收到相匹配的广播后即执行该接收器类
package com.example.broadcast_forceoffline;
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;
public class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// 接收到广播后弹出alertdialog对话框,alertdialog对象不能直接创建,需要先创建一个alertdialog.builder对象,然后再通过oncreat()方法创建alertdialog对象
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("warning"); //设置alertdialog的标题
builder.setMessage("you are force to be offline"); // 设置alertdialog的masssage内容
builder.setCancelable(false); //alertdialog不可通过返回取消
builder.setPositiveButton("ok", new OnClickListener() {
//设置确定按钮,第一个参数表示确定按钮的文字内容,第二个参数是监听行为,点击后执行如下onClick()内容
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
//将TASK任务栈中的activity全部finish掉,然后重启login界面
ActivityCollector.finishAll();
Intent intent = new Intent(context,LoginActivity.class);
//通过addflags方法给intent添加一个TASK,将重启的loginactivity放入TASK中显示
//此处可能会有疑问,为什么用intent进行两个activity进行跳转的时候不需要添加addflags,因为默认情况下flags是被跳转activity所在TASK,而此处我们是从BroadcastReceiver的上下文中跳转到activity的,接收器是不存在TASK中的,此时没有TASK,所以需要新建立一个TASK。
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
//alertdialog在BroadcastReceiver中没有父类window,需要设置系统window显示弹窗
AlertDialog alertDialog = builder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
五.创建ActivityCollector类和BaseActivity类,目的是在接收器中能实现对TASK中的所有activity进行finish,该应用的所有activity类都必须继承BaseActivity,而不是activity
1.ActivityCollector类:
package com.example.broadcast_forceoffline;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>();
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();
}
}
}
}
2. BaseActivity类,继承ActivityCollector类
package com.example.broadcast_forceoffline;
import com.example.broadcast_forceoffline.R;
import android.app.Activity;
import android.os.Bundle;
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
ActivityCollector.addActivity(this);
}
protected void onDestroy(){
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
六.运行程序
相关文章推荐
- Android四大组件之一:contentprovider & 三大存储方式之一:SQLite数据库存储 应用实例
- Android开发——四大组件BroadcastReceiver实例广播事件的拦截转发
- 四大应用组件之BroadcastReceiver【Android】
- 四大组件之——service应用实例一(在后台执行定时任务)
- 四大组件之一Service——应用实例二(IntentService类的使用)
- [Android知识体系]之四大组件:Content Provider应用实例
- 四大组件之service——应用实例三(活动和服务的通信&服务生命周期)
- android四大组件之BroadCastReceiver的开发实例
- Android四大组件之ContentProvider实现多应用之间传递数据实例
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
- android四大组件之Broadcast
- 浅谈Android四大组件之BroadcastReceiver
- 15_Android四大组件:Activity 、Service、Broadcast receiver 、Content provider
- Android应用程序组件Content Provider应用实例
- Android 四大组件之BroadcastReceiver(发送有序无序广播)
- Android进阶#(1/12)Android的构成基石——四大组件_Broadcast
- android四大组件之BroadcastReceiver
- Android四大组件:Activity、Service、Broadcast Receiver、Content Provider
- Android 四大组件 Broadcast 广播
- Android核心基础-9.Android四大组件之BroadcastReceiver