[ Android ]实验3.2 通知与广播

一、运行图

在这里插入图片描述

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);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值