• android广播事件处理broadcast receive


    一.Broadcast Receive为广播接收器,它和事件处理机制类似,只不过事件的处理机制是程序组件级别的,而广播处理机制是系统级别的。

    Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知。broadcast receiver可以通过多种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。

    通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的数据。


    二.事件的广播比价简单,构建Intent对象,调用sendBroadcast()方法将广播发出。事件的接收是通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中相应事件。
      MainActivity:
       Intent intent=new Intent();
       intent.setAction(MY_ACTION);
       intent.putExtra("msg","请回复");
       sendBroadcast(intent);
      MyReceiver:
       public calss MyReceiver extends BroadcastReceiver{
           public void onReceiver(Context ctx,intent intent){
                //从Intent中获得信息
               String msg=intent.getString("msg");
              Toast.makeText(ctx,msg,Toast.LENGTH_LONG).show()


              }


           }
      
    三.系统广播事件的使用
       1. 这些广播是系统自动发出,我们直接定义事件接收器进行接收。
          通过配置文件注册
          MyReceiver2:
         public class MyReceiver2 extends BroadcastReceiver{
                
               public void onReceiver( Context context,Intent intent){
                      Log.i("my_tag","BOOT_COMPLETED")
                        
                         }    


                     }
           AndroidMainifest.xml:
          <receiver android:name="MyReceiver2">
              <intent-filter>
                <android android:name="android.intent.android.BOOT_COMPLETED">
             </intent-filter>
           </receiver>
           通过代码注册:
           IntentFilter filter=new IntentFilter();//实例化
           //实例化Receiver
           MyReceiver2=new MyReceiver2();
          //注册Receiver
           registerReceiver(r,filter);
          //注销Receiver
           unregisterReceiver(r);
    四.Notification和NotificationManager的使用
       Broadcast Receiver组件并没有提供可视化的界面来显示广播信息。这里我们可以使用Notification和Notification Manager来实现可视化的信息的界面,通过使用它们 ,我们可以显示广播信息的内容,图标及震动信息。
    五.AlarmManager的使用
       现在的手机普遍都会有一个闹钟功能,如果使用Android来实现一个闹钟,可以使用AlarmManager来实现。AndroidManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个任务,AlarmManager对象一般不直接实例化,而是通过Context.getSystemService(Context.ALARM_SERVICE)方法获得。

    实例一、自定义broadcast receive来处理广播事件

    /Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MainActivity.java

    代码
    package com.amaker.ch08.app;

    import com.amaker.ch08.app.R;

    import android.app.Activity;
    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 Activity {
    // 定义一个Action常量
    private static final String MY_ACTION = "com.amaker.ch08.action.MY_ACTION";
    // 定义一个Button对象
    private Button btn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 设置当前布局视图
    setContentView(R.layout.main);
    btn
    = (Button)findViewById(R.id.Button01);
    // 为按钮设置单击监听器
    btn.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // 实例化Intent对象
    Intent intent = new Intent();
    // 设置Intent action属性
    intent.setAction(MY_ACTION);
    // 为Intent添加附加信息
    intent.putExtra("msg", "地瓜地瓜,我是土豆,收到请回复,收到请回复!");
    // 发出广播
    sendBroadcast(intent);
    }
    });
    }
    }

    自定义广播事件的使用

    /Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MyReceiver.java

    代码
    package com.amaker.ch08.app;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;

    /**
    * 接收广播
    */
    public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context cxt, Intent intent) {
    // 从Intent中获得信息
    String msg = intent.getStringExtra("msg");
    // 使用Toast显示
    Toast.makeText(cxt, msg, Toast.LENGTH_LONG).show();
    }
    }

    /Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MyReceiver2.java

    代码
    package com.amaker.ch08.app;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;

    /**
    *
    * 显示系统启动完成广播接收器
    */
    public class MyReceiver2 extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
    // 显示广播信息
    Log.i("my_tag", "BOOT_COMPLETED~~~~~~~~~~~~~~~~");
    }

    }

    系统广播事件的使用

    /Chapter08_Broadcast_Receiver1/res/layout/main.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >

    <Button
    android:text="发出广播..."
    android:id
    ="@+id/Button01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"/>

    </LinearLayout>

    /Chapter08_Broadcast_Receiver1/AndroidManifest.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
    ="com.amaker.ch08.app"
    android:versionCode
    ="1"
    android:versionName
    ="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MainActivity"
    android:label
    ="@string/app_name">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    <receiver android:name="MyReceiver">
    <intent-filter>
    <action android:name="com.amaker.ch08.action.MY_ACTION"/>
    </intent-filter>
    </receiver>

    <receiver android:name="MyReceiver2">
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
    </receiver>

    </application>
    <uses-sdk android:minSdkVersion="3" />
    </manifest>

    二、notification和notificationmanager的使用

            1、获取系统级的服务notificationmanager

            String service = NOTIFICATION_SERVICE;
            NotificationManager nm = (NotificationManager)getSystemService(service);
            
            2、实例化Notification
            Notification n = new Notification();
            // 设置显示图标,该图标会在状态栏显示
            int icon = n.icon = R.drawable.icon;
            // 设置显示提示信息,该信息也会在状态栏显示
            String tickerText = "Test Notification";
            // 显示时间
            long when = System.currentTimeMillis();
            n.icon = icon;
            n.tickerText = tickerText;
            n.when = when;

            // 也可以通过这种构造方法来设置
            Notification n1 = new Notification(icon, tickerText, when); 
            
            3、实例化Intent
            Intent intent = new Intent(this, MainActivity_Temp.class);
            // 获得PendingIntent
            PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
            // 设置事件信息
            n.setLatestEventInfo(this, "My Title", "My Content", pi); 
            n.defaults |= Notification.DEFAULT_SOUND;
            n.sound = Uri.parse("file:///sdcard/sound.mp3");
            n.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");

            n.defaults |= Notification.DEFAULT_VIBRATE;
            long[] vibrate = {0,50,100,150};
            n.vibrate = vibrate; 
            n.defaults |= Notification.DEFAULT_LIGHTS;
            n.ledARGB = 0xff00ff00;
            n.ledOnMS = 300;
            n.ledOffMS = 1000;
            n.flags |= Notification.FLAG_SHOW_LIGHTS; 
            

             4、发通知
            // 标示该通知的ID
            int ID = 1;
            // 发出通知
            nm.notify(ID, n);

    利用notification和notificationmanager来实现可视化的消息显示。

    /Chapter08_Notification1/src/com/amaker/ch08/app/MainActivity.java

    代码
    package com.amaker.ch08.app;

    import com.amaker.ch08.app.R;

    import android.app.Activity;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    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 Activity {
    // 声明按钮
    private Button sendBtn,cancelBtn;
    // 声明Notification
    private Notification n ;
    // 声明NotificationManager
    private NotificationManager nm;
    // Notification标示ID
    private static final int ID = 1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // 实例化按钮
    sendBtn = (Button)findViewById(R.id.sendButton01);
    cancelBtn
    = (Button)findViewById(R.id.cancelButton02);

    // 获得NotificationManager实例
    String service = NOTIFICATION_SERVICE;
    nm
    = (NotificationManager)getSystemService(service);

    // 实例化Notification
    n = new Notification();
    // 设置显示图标,该图标会在状态栏显示
    int icon = n.icon = R.drawable.happy;
    // 设置显示提示信息,该信息也会在状态栏显示
    String tickerText = "Test Notification";
    // 显示时间
    long when = System.currentTimeMillis();
    n.icon
    = icon;
    n.tickerText
    = tickerText;
    n.when
    = when;
    // 为按钮添加监听器
    sendBtn.setOnClickListener(sendListener);
    cancelBtn.setOnClickListener(cancelListener);

    }
    // 发送通知监听器
    private OnClickListener sendListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
    // 实例化Intent
    Intent intent = new Intent(MainActivity.this, MainActivity.class);
    // 获得PendingIntent
    PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
    // 设置事件信息
    n.setLatestEventInfo(MainActivity.this, "My Title", "My Content", pi);
    // 发出通知
    nm.notify(ID, n);
    }
    };
    // 取消通知监听器
    private OnClickListener cancelListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
    // 取消通知
    nm.cancel(ID);
    }
    };
    }

    /Chapter08_Notification1/res/layout/main.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >
    <TextView
    android:layout_width="fill_parent"
    android:layout_height
    ="wrap_content"
    android:text
    ="测试Notification"
    />

    <Button
    android:text="发出通知"
    android:id
    ="@+id/sendButton01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></Button>

    <Button
    android:text="取消通知"
    android:id
    ="@+id/cancelButton02"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></Button>

    </LinearLayout>

    /Chapter08_Notification1/AndroidManifest.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
    ="com.amaker.ch08.app"
    android:versionCode
    ="1"
    android:versionName
    ="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MainActivity"
    android:label
    ="@string/app_name">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    </application>
    <uses-sdk android:minSdkVersion="3" />

    </manifest>

    二、notification、notificationmanager和broadcast receiver的综合实例

    /Chapter08_Notification2/src/com/amaker/ch08/app/MainActivity.java

    代码
    package com.amaker.ch08.app;

    import com.amaker.ch08.app.R;

    import android.app.Activity;
    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 Activity {
    // 声明Button
    private Button btn;
    // 定义Broadcast Receiver action
    private static final String MY_ACTION = "com.amaker.ch08.app.MY_ACTION";
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 设置当前布局视图
    setContentView(R.layout.main);
    // 实例化Button
    btn = (Button)findViewById(R.id.Button01);
    // 添加事件监听器
    btn.setOnClickListener(listener);
    }
    // 创建事件监听器
    private OnClickListener listener = new OnClickListener() {
    @Override
    public void onClick(View v) {
    // 实例化Intent
    Intent intent = new Intent();
    // 设置Intent action属性
    intent.setAction(MY_ACTION);
    // 发起广播
    sendBroadcast(intent);
    }
    };
    }

    /Chapter08_Notification2/src/com/amaker/ch08/app/DisplayActivity.java

    代码
    package com.amaker.ch08.app;

    import com.amaker.ch08.app.R;

    import android.app.Activity;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class DisplayActivity extends Activity {
    // 声明按钮
    private Button cancelBtn;
    // 声明Notification
    private Notification n ;
    // 声明NotificationManager
    private NotificationManager nm;
    // Notification标示ID
    private static final int ID = 1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main2);
    // 实例化按钮
    cancelBtn = (Button)findViewById(R.id.cancelButton02);
    // 获得NotificationManager实例
    String service = NOTIFICATION_SERVICE;
    nm
    = (NotificationManager)getSystemService(service);

    // 实例化Notification
    n = new Notification();
    // 设置显示图标,该图标会在状态栏显示
    int icon = n.icon = R.drawable.happy;
    // 设置显示提示信息,该信息也会在状态栏显示
    String tickerText = "Test Notification";
    // 显示时间
    long when = System.currentTimeMillis();
    n.icon
    = icon;
    n.tickerText
    = tickerText;
    n.when
    = when;

    // 实例化Intent
    Intent intent = new Intent(this, MainActivity.class);
    // 获得PendingIntent
    PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
    // 设置事件信息
    n.setLatestEventInfo(this, "My Title", "My Content", pi);
    // 发出通知
    nm.notify(ID, n);

    // 为按钮添加监听器
    cancelBtn.setOnClickListener(cancelListener);
    }

    // 取消通知监听器
    private OnClickListener cancelListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
    // 取消通知
    nm.cancel(ID);
    }
    };
    }

    /Chapter08_Notification2/src/com/amaker/ch08/app/MyReceiver.java

    代码
    package com.amaker.ch08.app;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;

    public class MyReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
    // 实例化Intent
    Intent i = new Intent();
    // 在新的任务中启动Activity
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    // 设置Intent启动的组件名称
    i.setClass(context, DisplayActivity.class);
    // 启动Activity显示通知
    context.startActivity(i);
    }

    }

    /Chapter08_Notification2/res/layout/main.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >

    <Button
    android:text="发出广播"
    android:id
    ="@+id/Button01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></Button>

    </LinearLayout>
    代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
    ="com.amaker.ch08.app"
    android:versionCode
    ="1"
    android:versionName
    ="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MainActivity"
    android:label
    ="@string/app_name">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    <receiver android:name="MyReceiver">
    <intent-filter>
    <action android:name="com.amaker.ch08.app.MY_ACTION"/>
    </intent-filter>
    </receiver>

    <activity android:name="DisplayActivity"/>

    </application>
    <uses-sdk android:minSdkVersion="3" />

    </manifest>
  • 相关阅读:
    SpringBoot系列之切换log4j日志框架
    SpringBoot系列之日志框架使用教程
    SpringBoot系列之集成logback实现日志打印(篇二)
    源码学习系列之SpringBoot自动配置(篇二)
    SpringBoot系列之@Conditional注解用法简介
    7.Maven命令
    6.Maven构建过程的各个环节
    5.Maven坐标
    4.用IntelliJ IDEA 创建Maven Web
    3.用IntelliJ IDEA 创建Maven
  • 原文地址:https://www.cnblogs.com/linzheng/p/1942053.html
Copyright © 2020-2023  润新知