Android 实现通知栏和进度条效果(适用于Android8.0以上)

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
👉点击跳转到网站

前言:

动态效果图就不展示了,因为我的安卓模拟器是Android3.几的,在模拟器上跑不了,索性就上张图片,知道是要实现什么效果就行了。

在这里插入图片描述
代码如下,注释都已经在代码中给出,可以直接拿起来就用。

public class MainActivity extends AppCompatActivity {

    //定义notification实用的ID
    private static final String MESSAGES_CHANNEL = "messages";
    private NotificationManager notificationManager;
    private Context context;
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void show(View view) {
        createMessageNotificationChannel();
        final int NEW_MESSAGE_ID = 0;
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, MESSAGES_CHANNEL);
        String title = "正在下载";
        String text = "我正在下载Android相关资料";
        Intent intent = new Intent();
        PendingIntent pendingIntent = null;
        intent.setClass(MainActivity.this, BrodeCaste.class);
        pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        builder.setSmallIcon(R.drawable.ic_launcher_background) // //小图标
                .setContentTitle(title)  //通知标题
                .setContentText(text)  //描述性文本
                .setContentIntent(pendingIntent) //点击通知栏跳转到指定页面
                .setAutoCancel(true)    //点击通知后关闭通知
                .setOnlyAlertOnce(true); //设置提示音只响一次

        //通知栏进度条
        new Thread(new Runnable() {
            @Override
            public void run() {

                for (int i = 0; i < 100; i++) {
                    builder.setProgress(100, i, false);
                    builder.setContentText("下载" + i + "%");
                    notificationManager.notify(NEW_MESSAGE_ID, builder.build());
                }
                //模拟网络加载
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                builder.setContentText("下载完成");
                notificationManager.notify(NEW_MESSAGE_ID, builder.build());

            }
        }).start();
    }

    //在Android8.0之后必须创建通知渠道
    private void createMessageNotificationChannel() {
    	//Build.VERSION.SDK_INT 代表操作系统的版本号  
    	//Build.VERSION_CODES.O 版本号为26 对应的Android8.0版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = this.getString(R.string.app_name);
            NotificationChannel channel = new NotificationChannel(
                    MESSAGES_CHANNEL,
                    name,
                    NotificationManager.IMPORTANCE_HIGH
            );
            notificationManager = this.getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
}

上面是通过模拟网络加载去实现进度条的更新,在实际开发中肯定不会这样做,下面以下载文件为例,通过网络加载,显示进度条效果。

			//设置进度条操作
			
            URL url = new URL(fileurl);
            打开和URL之间的连接
            connection = (HttpURLConnection) url.openConnection();
            //设置网络请求为get请求
            connection.setRequestMethod("GET");
            //开始读取服务器端数据,到了指定时间还没有读到数据,则报超时异常
            connection.setReadTimeout(50000);
            //建立实际的连接
            connection.connect();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int total_length = 0;
                    try {
                        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                            InputStream is = connection.getInputStream();
                            //获取文件流大小,更新进度
                            byte[] buffer = new byte[1024];
                            int len;
                            int pro1 = 0;
                            long file_length = connection.getContentLength();
                            while ((len = is.read(buffer)) != -1) {
                                total_length += len;
                                if (file_length > 0) {
                                    pro1 = (int) ((total_length / (float) file_length) * 100);//进度条传递进度
                                    builder.setProgress(100, pro1, false);
                                    builder.setContentText("下载" + pro1 + "%");
                                    notificationManager.notify(NEW_MESSAGE_ID, builder.build());
                                }
                            }
                            builder.setStyle(new NotificationCompat.BigTextStyle().bigText("下载完成,点击查看")); //显示多行文本
                            notificationManager.notify(NEW_MESSAGE_ID, builder.build());
                            //关闭资源
                            is.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();

这个是在主线程中操作的,但是我们都知道在主线程中进行网络请求,会阻塞后面代码的执行,当然也会影响主界面UI显示,造成进度条显示卡顿,不能切换页面的操作。

当然并不是说就没有办法在主线程中执行网络操作了,我们可以用StrictMode类去修改默认的策略。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

加入这行代码即可,这样进度条就会根据文件大小去进行快与慢的显示,达到了一个很好的用户体验效果,当然这个进度条只是显示给用户看的其实没有什么实际的意义,就只是单单的一个显示效果而已,但这也是不可或缺的。

分析:

URL (UniformResource Locator)对象代表统一资源定位器,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更复杂的对象的引用。
connection.getResponseCode():http状态返回代码
HttpURLConnection.HTTP_OK:状态代码200 服务器已成功处理了请求

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要显示音量进度条,可以使用Android系统提供的SeekBar控件。下面是一个简单的示例: 1. 在布局文件中添加SeekBar控件: ``` <SeekBar android:id="@+id/volume_seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:progress="50" /> ``` 2. 在Activity中获取SeekBar控件的实例,并设置OnSeekBarChangeListener监听器: ``` SeekBar volumeSeekBar = findViewById(R.id.volume_seekbar); volumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 当SeekBar的值发生改变时调用 // 可以在这里更新音量 } @Override public void onStartTrackingTouch(SeekBar seekBar) { // 当用户开始拖动SeekBar时调用 } @Override public void onStopTrackingTouch(SeekBar seekBar) { // 当用户停止拖动SeekBar时调用 } }); ``` 在onProgressChanged方法中,可以获取SeekBar的当前值,然后根据需要更新音量。例如,可以使用AudioManager来设置系统音量: ``` AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int volume = progress * maxVolume / 100; audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0); ``` 这样就可以实现音量进度条的功能了。 ### 回答2: Android 9.0的音量进度条是指在调整设备音量时,屏幕上显示的进度条。在Android 9.0中,音量进度条设计更加简洁、直观,并且有一些新的功能和改进。 首先,音量进度条的外观进行了改变。它现在呈现为一个垂直的条形图,显示当前音量的百分比,同时配备有一个可拖动的滑块。这样的设计更加直观,让用户更容易了解当前设备的音量情况。 其次,麦克风的音量条也有所改进。在Android 9.0中,不仅有媒体音量和通知音量的进度条,还添加了麦克风音量的进度条。用户可以通过拖动滑块来调整麦克风的音量大小,方便进行录音或通话等活动。 此外,音量进度条还配备了一些新增的功能。例如,用户可以通过点击音量图标旁边的箭头,快速切换不同类型的音量,比如在媒体音量和通知音量之间进行切换。此外,用户还可以通过长按音量调节键,进入更详细的音量设置界面,对不同类型的音量进行单独调整。 总的来说,Android 9.0的音量进度条通过简洁直观的设计,方便用户了解和调整设备的音量。新增的功能和改进使得用户能够更加灵活地控制不同类型的音量,提高了用户体验。 ### 回答3: Android 9.0系统中的音量进度条是指控制设备音量的一个界面元素。在Android 9.0中,音量进度条通常显示在设备的通知或者系统设置中。 用户可以通过滑动音量进度条来调整设备的音量大小。在滑动过程中,用户可以看到进度条实时更新,以显示当前音量的百分比。 音量进度条通常分为媒体音量和铃声音量两部分。用户可以通过点击进度条旁边的图标来切换调整不同类型的音量。媒体音量是指设备在播放音频、视频或者游戏时的音量大小,而铃声音量则是指设备在接收来电或者收到新消息时的音量大小。 此外,音量进度条还提供了静音或者振动模式的选项。用户可以点击进度条旁边的图标来切换设备的声音模式。静音模式将关闭设备的所有声音,而振动模式则使设备在接收来电或者新消息时震动而无声。 需要注意的是,在一些设备上,音量进度条还提供了更详细的调整方式。用户可以点击进度条下方的设置按钮,来进一步调整不同的音频通道,如通话音量、闹钟音量、系统音量等。 总而言之,Android 9.0音量进度条是一种方便用户调整设备音量的界面元素,它显示了当前音量的百分比,并提供了切换静音/振动模式的选项,以及进一步调整不同音频通道的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值