Android学习笔记(五五):通知Notification(下)

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

}

相关链接: 我的Android开发相关文章

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: android.app.remoteserviceexception: bad notification for startforeground是一个异常,通常是由于在启动前台服务时,通知的参数不正确导致的。这个异常通常会在Android应用程序中出现,需要检查代码中的通知参数是否正确,以确保启动前台服务时不会出现异常。如果您需要更多的帮助,请提供更多的上下文信息,以便我们更好地理解您的问题。 ### 回答2: Android.app.remoteserviceexception是一种异常,通常在通过启动前台服务时发生。在Android系统中,前台服务比后台服务更重要,因为它们能够向用户显示通知,使用户了解到正在运行的服务,同时确保系统不会在资源紧张时关闭它们。启动前台服务时,应该向系统提供可让用户了解服务正在运行的通知。 当出现“bad notification for startforeground”异常时,通常表示通知无效或不可用。这可能是因为通知没有正确地设置,或者可能是因为通知复制失败,例如,如果通知超过了允许的大小限制。如果通知无效,它将无法在前台服务启动后正确地显示给用户。 要解决此异常,您需要检查通知的正确性。首先,您需要确保通知具有必要的元素,例如标题和内容。其次,您需要确保正确设置通知的id,以确保通知可以正常显示和更新。还可以检查通知是否越过了允许的大小限制,导致通知无效。 此外,您可以使用日志来检查异常的详细信息,并确定导致该问题的根本原因。通过日志,您可以查看哪些操作导致了异常,以及异常的位置。这可以帮助您快速解决问题,并确保您能够提供正常运行的前台服务。 总之,在启动前台服务时,您应该充分了解通知的重要性,并确保它们得到正确的设置。如果遇到bad notification for startforeground异常,您应该检查通知是否有效和正确设置,以确保正常运行您的前台服务。 ### 回答3: 在 Android 应用程序开发中,有时候会遇到 android.app.remoteserviceexception: bad notification for startforeground 错误。这个错误通常是因为通知栏的设置不正确,而导致的崩溃异常。 在 Android 系统中,使用 Foreground Service 进行长时间运行的任务,需要在通知栏中创建一个持久的通知,来告知用户当前正在后台运行的任务。在创建通知时,需要注意以下几点: 1. 通知的 Channel ID 要正确设置,与 Notification Channel 一致。 2. 通知的 Icon 要正确设置,不能为 0。 3. 通知的 Title 和 Content 要正确设置,以便用户能够理解当前后台运行的任务。 如果通知栏的设置不正确,就可能会引起 android.app.remoteserviceexception: bad notification for startforeground 错误。通常这个错误会在 startForeground 方法被调用时出现,导致应用程序崩溃。 为了解决这个问题,我们可以检查通知栏的设置是否正确,尤其是 Channel ID、Icon、Title 和 Content 等参数。同时,也可以查看日志文件,找出造成错误的具体原因,再进行相应的修复。另外,在 Android 8.0 及以上的版本中,还需要注意是否已经创建了 Notification Channel。如果没有创建 Notification Channel,也会导致类似的错误。 总的来说,android.app.remoteserviceexception: bad notification for startforeground 错误是由于通知栏的设置不正确,而导致的崩溃异常。对于开发者来说,需要仔细检查通知栏的设置,确保各个参数都正确无误,避免出现类似的错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值