您的位置:首页 > 移动开发 > Android开发

四大组件之一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);
}

}

六.运行程序





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息