Android学习笔记(五二):服务Service(中)- 继承Service类

通过IntentService的继承类实现命令触发的服务,也可以直接通过Service的继承类来实现。在IntentService中的例子,我们增加了StopService( )的方式,用于试验。在实际应用中,IntentService常用于一次性运行,自动结束的情况,不需要人工停止干预。对于需要人工干预的停止的,长时间(或无限制)运行的情况,可直接继承Service的方式,例如音乐播放。IntentService也是Service的一个继承类。

继承Service类

在本例中,我们中我们模拟音乐播放,提供了两个参数,一个是音乐列表,一个是无序播放标识。

和上一例子不同,Service不会自动结束,必须要用户干预。例如播放音乐或者audiobook,当用户离开Appcliation时,音乐还能继续播放,service会持续下去,不停止,直至用户主动停止服务,即使音乐播放完毕,模式也非循环播放,当播放完所有音乐时,service仍然存在,直至用户主导stopService()或者服务本身stopSelf()。例子是个模拟例子,不涉及真正的音乐播放。

客户端代码

public class ServiceTest2 extends Activity{ 
    ... ... 
    //对于客户端,和上次例子相似,通过Intent作为命令,本例传递的参数为两个,通过startService()来启动服务。 
    private void startPlayer(){
        Intent i = new Intent(this,ServicePlayer.class);
        i.putExtra(ServicePlayer.EXTRA_PLAYLIST, "playlist");
        i.putExtra(ServicePlayer.EXTRA_SHUFFLE, true);
        startService(i);
    }
    //有用户干预的停止服务。在例子中,我们并不使用创建服务的intent,因为Activity的生命周期可能已经结束,intent已被垃圾回收,我们重新开启Activity,在新的Activity中,不需开启服务就可直接停止。 
    private void stopPlayer(){
       stopService(new Intent(this,ServicePlayer.class));
    }
}

Service端代码

  public class ServicePlayer extends Service{
   public static final String EXTRA_PLAYLIST = "com.wei.android.learning.EXTRA_PLAYLIST";
    public static final String EXTRA_SHUFFLE = "com.wei.android.learning.EXTRA_SHUFFLE";
    private boolean isPlaying = false;
 
    //将在以后学习Bind Service的模式
    public IBinder onBind(Intent arg0)
        return null;
    }
    //收到客户端触发,如果服务尚未启动,则先执行onCreate(),再此进行服务初始化处理。 
    public void onCreate() {
        super.onCreate();
    } 
    //在收到stopService()时触发,我们将在此处理停止Service的相关事宜,例如停止后台线程的运行等等。 
    public void onDestroy()
        playStop();
        super.onDestroy();
    } 
    //当系统内存少时,将要求终止服务,我们在此进行关闭服务的处理,例如保持相关的状态等,如服务部需保持特定状态,则无需重写此方法。  
    public void onLowMemory()

        super.onLowMemory();
    }  
    //收到客户端请求时触发,由于onStartCommand()运行在主线程,将进行本次服务的初始化,并开启后台线程运行相关的处理,具体参加线程的学习笔记,本例只考察Service相关内容。返回值将告诉系统如果service的进程被杀掉,将会如何:START_STICKY表示服务将回到开始状态,如同onStartCommand()被called,但是Intent不会重发;START_REDELIVER_INTENT表示要求系统重新发送一次Intent,即服务将重新触发执行onStartCommand();START_NOT_STICKY表示无需干预,服务停止,等待有新的命令触发。
    public int onStartCommand(Intent intent, int flags, int startId)
        showInfo("onStartCommand");
        String playlist = intent.getStringExtra(EXTRA_PLAYLIST);
        boolean suffle = intent.getBooleanExtra(EXTRA_SHUFFLE, false);
        playStart(playlist,suffle);
        return START_NOT_STICKY;
    } 
    private void playStart(String playlist, boolean suffle){
        if(! isPlaying){ 
            isPlaying = true;
        }
    } 
    private void  playStop(){
        if( isPlaying){
            showInfo("Go to Stop!");
            isPlaying = false;
        }
    }

}

如果有三个客户端都通过startService(),也只会启动一个服务。只有第一个发出命令时,系统发现服务没有启动,将启动服务,其余的直接触发onStartCommand()。通过startService()并不仅仅是发送命令,而是告诉系统服务维持运行,直至通知它服务停止。

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值