可以绑定的Android前台服务

前端之家收集整理的这篇文章主要介绍了可以绑定的Android前台服务前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
前台服务的正确方法是什么,我以后可以绑定它?
我已经关注了 Android API演示,其中包含了如何创建前台服务的示例.
关于启动服务同时绑定它没有任何示例.

我希望看到音乐播放器服务的一个很好的例子,其活动“绑定”它.

有没有?

我想做的事情如下:

>当程序是第一个(第一个意味着服务尚未启动)时,我想启动前台服务,完成所有工作.用户界面(活动)就是控制该工作
>如果用户按下主页按钮服务必须保持运行(并且必须存在栏中的通知)
>现在,如果用户点击通知栏活动中的通知应该启动并绑定到服务(或类似的东西,正确的方式),用户可以控制作业.
>如果活动处于活动状态且用户按下按钮,则应销毁活动,并且还应销毁服务.

我必须覆盖哪些方法才能完成此任务?这样做的Android方式是什么?

解决方法

在froyo之前,在服务中有setForeground(true)这很容易,但也容易被滥用.

现在有startForeGround服务需要激活通知(因此用户可以看到有一个前台服务正在运行).

我让这个班来控制它:

public class NotificationUpdater {
    public static void turnOnForeground(Service srv,int notifID,NotificationManager mNotificationManager,Notification notif) {
        try {
            Method m = Service.class.getMethod("startForeground",new Class[] {int.class,Notification.class});
            m.invoke(srv,notifID,notif);
        } catch (Exception e) {
            srv.setForeground(true);
            mNotificationManager.notify(notifID,notif);
        }
    } 

    public static void turnOffForeground(Service srv,NotificationManager mNotificationManager) {
        try {
            Method m = Service.class.getMethod("stopForeground",new Class[] {boolean.class});
            m.invoke(srv,true);
        } catch (Exception e) {
            srv.setForeground(false);
            mNotificationManager.cancel(notifID);
        }
    }
}

然后为我的媒体播放器更新通知 – 注意前台服务只在媒体播放时需要,并且应该在停止后保持开启,这是一个不好的做法.

private void updateNotification(){
    boolean playing = ((mFGPlayerBean.getState()==MediaPlayerWrapper.STATE_PLAYING) || 
                        (mBGPlayerBean.getState()==MediaPlayerWrapper.STATE_PLAYING));
    if (playing) {
        Notification notification = getNotification();
        NotificationUpdater.turnOnForeground(this,Globals.NOTIFICATION_ID_MP,mNotificationManager,notification);
    } else {
        NotificationUpdater.turnOffForeground(this,mNotificationManager);
    }
}

至于绑定 – 你只需要在你的活动onStart中以正常的方式绑定你只需要绑定到任何服务就可以进行bindService调用(无论天气如何,它都无关紧要)

MediaPlayerService mpService=null;
@Override
protected void onEWCreate(Bundle savedInstanceState) {
     Intent intent = new Intent(this,MediaPlayerService.class);
     startService(intent);
}

@Override
protected void onStart() {
    // assume startService has been called already
    if (mpService==null) {
        Intent intentBind = new Intent(this,MediaPlayerService.class);
        bindService(intentBind,mConnection,0);
    }
}

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className,IBinder service) {
        mpService = ((MediaPlayerService.MediaBinder)service).getService();
    }

    public void onServiceDisconnected(ComponentName className) {
        mpService = null;
    }
};

猜你在找的Android相关文章