四大组件之一Broadcast应用实例

我们常用的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);
}
}


六.运行程序




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值