文章目录
- 一、运行图
- 1.1 发送广播消息
- 1.2 清除通知图标
- 1.3 重启模拟器,广播接收器会接收到系统广播(android.intent.action.BOOT_COMPLETED 系统启动 )
- 二、代码
- 2.1 activity_main.xml
- 2.2 MainActivity.java
- 2.3 MyReceiver.java
- 2.4 AndroidManifest.xml
- 三、系统广播和通知
- 3.1 常见的系统广播常量
- 3.2 通知(Notification)
一、运行图
1.1 发送广播消息
1.2 清除通知图标
1.3 重启模拟器,广播接收器会接收到系统广播(android.intent.action.BOOT_COMPLETED 系统启动 )
二、代码
2.1 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
android:layout_marginTop="100dp"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/send"
android:text="发送广播消息"
android:textSize="25sp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cancel"
android:text="清除通知图标"
android:textSize="25sp"
/>
</LinearLayout>
2.2 MainActivity.java
package com.example.lab_3_2;
import androidx.appcompat.app.AppCompatActivity;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button send,cancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
send=findViewById(R.id.send);
cancel=findViewById(R.id.cancel);
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.example.lab_3_2.sendMsg");
registerReceiver(new MyReceiver(),intentFilter);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent("com.example.lab_3_2.sendMsg");
sendBroadcast(intent);
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NotificationManager notificationManager=(NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(1);
}
});
}
}
2.3 MyReceiver.java
package com.example.lab_3_2;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.widget.Toast;
import androidx.core.app.NotificationCompat;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"系统启动完成", Toast.LENGTH_LONG).show();
NotificationManager notifyMgr=(NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
String channelId="channelId",channelName="channelName";
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannel channel=new NotificationChannel(channelId
,channelName, NotificationManager.IMPORTANCE_DEFAULT);
notifyMgr.createNotificationChannel(channel);
}
NotificationCompat.Builder builder=new NotificationCompat.Builder(
context,channelId);
builder.setSmallIcon(R.drawable.flash)
// .setColor(context.getResources().getColor(R.color.purple_200))
.setColor(Color.parseColor("#FFBB86FC"))
.setContentTitle(context.getString(R.string.app_name))
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.drawable.home))
.setContentText("系统启动消息接收者")
.setWhen(System.currentTimeMillis())
.setAutoCancel(true);
notifyMgr.notify(1, builder.build());
}
}
2.4 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lab_3_2">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Lab_3_2">
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
三、系统广播和通知
3.1 常见的系统广播常量
android.intent.action.BOOT_COMPLETED 系统启动 android.intent.action.ACTION_TIME_CHANGED 时间改变 android.intent.action.ACTION_DATE_CHANGED 日期改变 android.intent.action.ACTION_TIMEZONE_CHANGED 时区改变 android.intent.action.ACTION_BATTERY_LOW 电量低 android.intent.action.ACTION_MEDIA_EJECT 插入或拔出外部媒体
android.intent.action.ACTION_MEDIA_BUTTON 按下多媒体键 android.intent.action.ACTION_PACKAGE_ADDED 添加包 android.intent.action.ACTION_PACKAGE_REMOVED 删除包
3.2 通知(Notification)
当应用程序在后台运行,希望向用户发出一些提示信息,就需要借助Notification(通知)来实现。
在发出一条通知后,手机最上方的状态栏会显示一个通知的图标,下拉状态栏后就可以看到通知的详细内容。
Notification是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification。
NotificationChannel(通知渠道)
NotificationChannel其实是把 Notification 分了个类别,设置不同优先级、开关等。如果你的 App 适配了的话,用户可以关掉不喜欢的通知,以提高用户体验性。
拥有了这些控制权之后,用户可以自主地选择自己关心哪些通知、不关心哪些通知,进而避免垃圾推送消息的打扰。
对于每个App来说,通知渠道的划分是非常需要仔细考究的,因为通知渠道一旦创建之后就无法再修改。因此开发者需要仔细分析自己的App一共有哪些类型的通知,然后再去创建相应的通知渠道。
Notification创建步骤
1、首先需要一个NotificationManager来进行管理
可以调用Context的getSystemService方法获取,这里传入一个Context.NOTIFICAATION_SERVICE即可。
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
2、创建NotificationChannel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
NotificationManager notificationManager = (NotificationManager) getSystemService(
NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
3、创建Notification对象
需要使用一个Builder构造器来创建Notification对象,由于API不同会造成不同版本的通知出现不稳定的问题, 所以这里使用NotificationCompat类来兼容各个版本。如果是8.0以下,channelId传入空即可。
Notification notification = new NotificationCompat.Builder(context,channelId).build();
4、Notification的基本设置
.setContentTitle(“这是测试通知标题”) //设置标题
.setContentText(“这是测试通知内容”) //设置内容
.setWhen(System.currentTimeMillis()) //设置时间
.setSmallIcon(R.mipmap.ic_launcher) //设置小图标
5、调用notify()让通知显示出来(第一个参数是ID, 保证每个通知所指定的id都是不同的,第二个参数是notification对象)
manager.notify(id, notification);
取消通知
manager.cancel(id);