做前台服务的正确方法是什么,我以后可以绑定它?
我已经关注了 Android API演示,其中包含了如何创建前台服务的示例.
关于启动服务同时绑定它没有任何示例.
我已经关注了 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; } };