1.认识广播


1、建立广播接收器(类)MyBroadcastReceiver并继承BroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {public MyBroadcastReceiver(){Log.d("jian", "MyBroadcastReceiver: 每次广播都会实例化的一个新的广播组件");}@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "广播已经启动", Toast.LENGTH_SHORT).show();}
}

2、Manifest中注册广播

<receiver android:name=".MyBroadcastReceiver" android:enabled="true"><intent-filter><action android:name="android.intent.action.EDIT"/>//自己指定的action</intent-filter>
</receiver>

在配置广播中,配置一个intent-filter节点,表示对一个指定的action操作的时候才会启动广播,这个action可以通过intent完成

3、activity文件

public class MainActivity extends AppCompatActivity {private Button butStartBroad=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);butStartBroad=findViewById(R.id.butStartBroad);butStartBroad.setOnClickListener(new OnClickListenerImpl());}private class OnClickListenerImpl implements View.OnClickListener{@Overridepublic void onClick(View v) {Intent intent=new Intent(Intent.ACTION_EDIT);//操作的过滤MainActivity.this.sendBroadcast(intent);//广播和服务一样,都是通过Activity程序启动,但是广播可以自动根据系统的状态启动Log.d("jian", "onClick: ----");}}
}

结果,并未实现,感觉是权限问题。

2.手工注册广播

1、建立广播接收器(类)MyBroadcastReceiver并继承BroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {public MyBroadcastReceiver(){Log.d("jian", "MyBroadcastReceiver: 每次广播都会实例化的一个新的广播组件");}@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "广播已经启动", Toast.LENGTH_SHORT).show();}
}

2、Manifest中注册广播

 <receiver android:name=".MyBroadcastReceiver"android:enabled="true"><intent-filter><action android:name="com.fengray.TEST"/>//自定义的过滤器</intent-filter></receiver>

3、主activity文件

public class MainActivity extends AppCompatActivity {private Button butStartBroad=null;private MyBroadcastReceiver broadcastReceiver=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);butStartBroad=findViewById(R.id.butStartBroad);butStartBroad.setOnClickListener(new OnClickListenerImpl());}private class OnClickListenerImpl implements View.OnClickListener{@Overridepublic void onClick(View v) {Intent intent=new Intent("com.fengray.TEST");//操作的过滤intent.putExtra("msg","com.fengray.TEST");//传递附加信息IntentFilter filter=new IntentFilter("com.fengray.TEST");//以自定义方式创建filter过滤器//注册广播broadcastReceiver=new MyBroadcastReceiver();registerReceiver(broadcastReceiver,filter);MainActivity.this.sendBroadcast(intent);//广播和服务一样,都是通过Activity程序启动,但是广播可以自动根据系统的状态启动}}
}

结果
2020-03-19 22:29:55.460 11950-11950/com.fengray.myex018broadcast D/jian: MyBroadcastReceiver: 每次广播都会实例化的一个新的广播组件
2020-03-19 22:29:55.465 11950-11950/com.fengray.myex018broadcast D/jian: onReceive:

3.过滤器改进

上例的基础上
1、建立广播接收器(类)MyBroadcastReceiver并继承BroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if ("com.fengray.TEST".equals(intent.getAction())){String msg=intent.getStringExtra("msg");Log.d("jian", msg);Toast.makeText(context, "广播已经启动"+msg, Toast.LENGTH_SHORT).show();}}
}

结果:
2020-03-19 22:32:32.223 12072-12072/com.fengray.myex018broadcast D/jian: com.fengray.TEST

4.通过BroadCast启动Service

通过activity启动广播,通过广播在启动service
1、manifest文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.fengray.myex018broadcast"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiver android:name=".MyBroadcastReceiver" android:enabled="true"><intent-filter><action android:name="com.fengray.TEST"/></intent-filter></receiver><service android:name=".MyService"/></application></manifest>

2、创建广播接收类

public class MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("jian", "onReceiveBroadcast: -----");//通过广播启动了servicecontext.startService(new Intent(context,MyService.class));}
}

3、创建服务类

public class MyService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {Log.d("jian", "service onCreate: ------");super.onCreate();}@SuppressLint("WrongConstant")@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d("jian", "onStartCommand: ------");return Service.START_CONTINUATION_MASK;}@Overridepublic void onDestroy() {Log.d("jian", "service onDestroy: ------");super.onDestroy();}
}

4、activity文件

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent=new Intent("com.fengray.TEST");//操作的过滤//注册广播sendBroadcast(intent);//广播和服务一样,都是通过Activity程序启动,但是广播可以自动根据系统的状态启动}@Overrideprotected void onStop() {//注销广播super.onStop();}
}

结果:
未能显示,不知道原因,大概率同第一个例子

改成手动注册,则可以成功
主activity文件改为:

public class MainActivity extends AppCompatActivity {private BroadcastReceiver broadcastReceiver=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent=new Intent("com.fengray.TEST");//操作的过滤intent.putExtra("msg","com.fengray.TEST");//传递附加信息IntentFilter filter=new IntentFilter("com.fengray.TEST");//以自定义方式创建filter过滤器//注册广播broadcastReceiver=new MyBroadcastReceiver();registerReceiver(broadcastReceiver,filter);MainActivity.this.sendBroadcast(intent);//广播和服务一样,都是通过Activity程序启动,但是广播可以自动根据系统的状态启动//注册广播sendBroadcast(intent);//广播和服务一样,都是通过Activity程序启动,但是广播可以自动根据系统的状态启动}@Overrideprotected void onStop() {//注销广播super.onStop();}
}

结果:
2020-03-19 23:07:53.527 13160-13160/com.fengray.myex018broadcast D/jian: onReceiveBroadcast: -----
2020-03-19 23:07:53.529 13160-13160/com.fengray.myex018broadcast D/jian: onReceiveBroadcast: -----
2020-03-19 23:07:54.207 13160-13160/com.fengray.myex018broadcast D/jian: service onCreate: ------
2020-03-19 23:07:54.207 13160-13160/com.fengray.myex018broadcast D/jian: onStartCommand: ------
2020-03-19 23:07:54.218 13160-13160/com.fengray.myex018broadcast D/jian: onStartCommand: ------

但时间久后为关闭程序

5.一个通过broadcast的闹钟的案例


1、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TimePickerandroid:id="@+id/time"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="当前没有设置闹钟"/><Buttonandroid:id="@+id/butset"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="设置闹钟"/><Buttonandroid:id="@+id/butdelet"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="删除闹钟"/></LinearLayout>

2、设置一个AarmMessage类

public class AlarmMessage extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);new AlertDialog.Builder(this).setIcon(R.drawable.dress01).setTitle("时间已经到").setMessage("闹钟响了,现在时间:"+new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())).setPositiveButton("关闭", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}}).show();}
}

3、设置一个BroadcastReveiver类

public class MyAlarmReveiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Intent it=new Intent(context,AlarmMessage.class);it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startService(it);}
}

4、activity文件

public class MainActivity extends AppCompatActivity {private AlarmManager alarmManager=null;private Button butset,butdelet;private TextView msg;private TimePicker timePicker=null;private  int hourOfDay,minute;private Calendar calendar=Calendar.getInstance();//返回值是长整形@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);butset=findViewById(R.id.butset);butdelet=findViewById(R.id.butdelet);msg=findViewById(R.id.msg);timePicker=findViewById(R.id.time);alarmManager= (AlarmManager) getSystemService(Context.ALARM_SERVICE);butset.setOnClickListener(new SetterOnclickListenerImpl());butdelet.setOnClickListener(new DeleterOnclickListenerImpl());timePicker.setIs24HourView(true);timePicker.setOnTimeChangedListener(new OnTimeChangeListenerImpl());}private class OnTimeChangeListenerImpl implements TimePicker.OnTimeChangedListener{@Overridepublic void onTimeChanged(TimePicker view, int hourOfDay, int minute) {MainActivity.this.calendar.setTimeInMillis(System.currentTimeMillis());MainActivity.this.calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);MainActivity.this.calendar.set(Calendar.MINUTE,minute);MainActivity.this.calendar.set(Calendar.SECOND,0);MainActivity.this.hourOfDay=hourOfDay;MainActivity.this.minute=minute;}}private class SetterOnclickListenerImpl implements View.OnClickListener{@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,MyAlarmReveiver.class);intent.setAction("com.fengray.action.setalarm");PendingIntent sender=PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),sender);msg.setText("闹钟响起的时间是:"+hourOfDay+"时"+minute+"分");Toast.makeText(MainActivity.this, "闹钟设置成功", Toast.LENGTH_SHORT).show();}}private class DeleterOnclickListenerImpl implements View.OnClickListener{@Overridepublic void onClick(View v) {if (alarmManager!=null){Intent intent=new Intent(MainActivity.this,MyAlarmReveiver.class);intent.setAction("com.fengray.action.setalarm");PendingIntent sender=PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);alarmManager.cancel(sender);//取消intentmsg.setText("当前没有设置闹钟");Toast.makeText(MainActivity.this, "闹钟删除成功", Toast.LENGTH_SHORT).show();}}}
}

结果:

魔乐科技安卓开发教程----李兴华----07BroadCast广播相关推荐

  1. 魔乐科技安卓开发教程----李兴华----08APPWidget

    1.认识Widget 通过桌面的一些软件窗口实现对程序得控制,需要使用的类 RemotView 2.创建一个Widget 1.创建一个类,继承自AppWidgetProvider public cla ...

  2. 魔乐科技安卓开发教程----李兴华----01文件存储

    1.查看模拟器data文件夹 到-sdk\platform-tools文件夹下Shift+鼠标右键打开命令窗口(win7),输入adb root回车然后输入adb remount回车, 出现remou ...

  3. 魔乐科技安卓开发教程----李兴华----06PendingIntent

    1.intent和PendingIntent的区别 intent表示执行某种意图 pendingIntent表示暂缓执行某种意图,直到遇到特殊条件才执行 2.发送通知:Notification 参考文 ...

  4. 魔乐科技安卓开发教程----李兴华----13视频录制

    1.录制视频 1.添加各种权限及横屏属性 //传感器决定 参考: Activity的screenOrientation属性详解 <uses-permission android:name=&qu ...

  5. 魔乐科技安卓开发教程----李兴华----05Service

    1.开启.终止服务 1.布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo ...

  6. 魔乐科技安卓开发教程----李兴华----10动画

    1.渐变动画TweenAnimation 2.创建透明度变化 1.主布局文件 <LinearLayout xmlns:android="http://schemas.android.c ...

  7. 魔乐科技安卓开发教程----李兴华----12音频录制

    1.MediaRecorder 2.MediaRecorder类的生命周期 2.一个录音的案例 点击下载本例代码 1.定义列表的布局 创建布局文件recode_files.xml <TableL ...

  8. 魔乐科技安卓开发教程----李兴华----19 传感器

    1.传感器常用方法及常量 android中支持的传感器 2.移动小球(方位传感器) 1.创建一个自定义的View类,Ballview public class BallView extends Vie ...

  9. 魔乐科技安卓开发教程----李兴华----03菜单

    1.ActivityGroup+GridView方式的基本菜单 1.创建用于显示icon的activity:MyActivity及其布局文件mylayout.xml mylayout <Line ...

最新文章

  1. 谷歌被指骗取人脸数据:部分获取方法可疑
  2. GAN作用——在我做安全的看来,就是做数据拟合、数据增强
  3. CSS中常用中文字体的Unicode编码
  4. zend studio 5出来了
  5. serlvet中的过滤器filter
  6. php生成16位不重复随机码,PHP n个不重复的随机数生成代码
  7. 前端学习(2762):如何使用scss
  8. 博客园的博客终于开通了
  9. 存储芯片在智能化产业链中扮演的角色将更加重要
  10. 工作流软件是未来web的支柱
  11. 夺命雷公狗---微信开发54----微信js-sdk接口开发(1)之快速入门
  12. Atitit aes 加密法php实现
  13. Python(六):dict、set
  14. 对计算机进行培训内容,对计算机培训的心得体会
  15. 安全算法-对称加密与非对称加密
  16. ARMA模型结合PSO算法进行股票预测
  17. failover.mysql_物理standby的Failover
  18. 点云外包矩形框(六面体)
  19. python-linux-获取多台远端机器指定文件并下载至本地(s**y-日志审计)
  20. 微信小游戏中监听一个按钮的点击事件方法

热门文章

  1. 如何让Ai帮数据分析师干活-工作1
  2. C语言用递归求最大公约数
  3. 0x80070002错误代码怎么解决(0x80070002错误代码怎么解决方法)
  4. 头部和四肢血量间相互流动速率系数的确定(含python代码)
  5. 【用VSCode编写MarkDown并导出Epub电子书】
  6. 大型数据库设计原理实验1
  7. IntentFilter
  8. 客户至上 服务至极 ——优维服务流程标准化体系
  9. Sigrity仿真之POWER DC操作步骤
  10. 浅谈情报的实践与落地