zoukankan      html  css  js  c++  java
  • Android学习笔记(五五):通知Notification(下)

    原文地址:http://blog.csdn.net/flowingflying/article/details/8891129

    Notification除了用于后台服务通知,还常用在下面情况:

    (1)保持服务存在。当系统内存不足时,系统会认为某后台服务占用内存时间太长而中止该服务,以释放内存。对于某些服务,例如播放音乐,如果系统对该服务进行资源释放,用户体验就成了音乐突然没有声音。对这类服务,我们希望享有更高的优先级别,不会被系统干掉。

    (2)用户随时与服务进行互动。例如播放音乐的服务,用户可随时暂停音乐播放,或选择其他曲目,甚至中止播放音乐服务。

    要实现上述两点,方法是在Service中宣称自己是foreground,并维持一个通知来向用户表明foreground状态,用户可以通过下拉通知并点击通知,进入该服务界面,实施互动操作。

    我们将在Android学习笔记(五二):服务Service(中)- 继承Service类的模拟音乐播放例子上进行扩展。

    FakePlayer同原例子的客户端代码,略过不表。Service的代码如下

    public class FakePlayerService extends Service{ 
        public static final String EXTRA_PLAYLIST="EXTRA_PLAYLIST";
         public static final String EXTRA_SHUFFLE="EXTRA_SHUFFLE"; 
        private boolean isPlay = false; 
        private static final int NOTIFY_FAKEPLAYER_ID=1339;  
         
        public IBinder onBind(Intent arg0) {  
            return null; 
        } 
    
        public void onDestroy() {  
            stop(); 
        } 
    
        public int onStartCommand(Intent intent, int flags, int startId) {  
            String playlist = intent.getStringExtra(EXTRA_PLAYLIST);
             Boolean isShuffle = intent.getBooleanExtra(EXTRA_SHUFFLE, false); 
            play(playlist,isShuffle); 
            return START_NOT_STICKY; 
        } 
        
        private void play(String playlist, Boolean isShuffle){  
            if(!isPlay){  
                isPlay = true; 
                //和上一笔记中创建通知的步骤一样,只是不需要通过通知管理器进行触发,而是用startForeground(ID,notify)来处理
                 //步骤1:和上一笔记一样,通过Notification.Builder( )来创建通知
                 //FakePlayer就是两个大button的activity,也即服务的界面,见最左图
                 Intent i = new Intent(this,FakePlayer.class);
                 //注意Intent的flag设置:FLAG_ACTIVITY_CLEAR_TOP: 如果activity已在当前任务中运行,在它前端的activity都会被关闭,它就成了最前端的activity。FLAG_ACTIVITY_SINGLE_TOP: 如果activity已经在最前端运行,则不需要再加载。设置这两个flag,就是让一个且唯一的一个activity(服务界面)运行在最前端。
                 i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                 PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);           
                 Notification myNotify = new Notification.Builder(this) 
                                        .setSmallIcon(R.drawable.shield) 
                                        .setTicker("Fake Player: " + playlist) 
                                        .setContentTitle("Test") 
                                        .setContentText("Now Playing: "Ummmm, Nothing"")
                                         .setContentIntent(pi) 
                                        .build();             
                //设置notification的flag,表明在点击通知后,通知并不会消失,也在最右图上仍在通知栏显示图标。这是确保在activity中退出后,状态栏仍有图标可提下拉、点击,再次进入activity。
                 myNotify.flags |= Notification.FLAG_NO_CLEAR;
                 
               // 步骤 2:startForeground( int, Notification)将服务设置为foreground状态,使系统知道该服务是用户关注,低内存情况下不会killed,并提供通知向用户表明处于foreground状态。
                 startForeground(NOTIFY_FAKEPLAYER_ID,myNotify);
             } 
        } 
        
        private void stop(){ 
            if(isPlay){ 
                isPlay = false; 
               //将服务从forefround状态中移走,使得系统可以在低内存的情况下清除它。 
                 stopForeground(true);  
            } 
        } 
    
    } 

     

  • 相关阅读:
    数据结构与算法参考答案(第十三周)
    数据结构与算法参考答案(第十二周)
    数据结构与算法参考答案(第十一周)
    数据结构与算法参考答案(第十周)
    数学建模国赛注意事项(持续更新)
    数值分析期末复习秘籍
    2020第十一届蓝桥杯软件类省赛第二场C/C++ 大学 B 组 填空题题解(未拿省一的个人反思)
    2020第十一届蓝桥杯软件类省赛第二场C/C++ 大学 B 组 E: 七段码(DFS,二进制枚举+并查集判重)
    递归实现指数型枚举(DFS)
    Codeforces Round #678 (Div. 2)B. Prime Square(矩阵均匀构造)
  • 原文地址:https://www.cnblogs.com/ericyuan/p/3566143.html
Copyright © 2011-2022 走看看