Android四大组件之:service

    今天,继续进行我的行动计划,第二篇:Android四大组件之:Service,那么Service是什么呢?打开手机的音乐播放器(比如酷狗,网易),然后按Home键,回到主界面,但音乐依旧在播放。这就是Service。

       Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。

Service有两种状态,“启动的”和“绑定”。

   文字对理科生来说有点啰嗦,直接上代码

package com.example.servicedome;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
private MediaPlayer mp;//声明一个音乐播放器

@Override

//服务第一次创建时启动,只会运行一次
public void onCreate() {
// TODO Auto-generated method stub
mp = MediaPlayer.create(this, R.raw.mymuse);
Log.i("service", "onCreate");
super.onCreate();
}


@Override

//服务创建后运行,以后每次运行服务时,只要服务已存在,只会运行该方法,不会重新创建
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
mp.start();
Log.i("service", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}

@Override

//服务销毁时运行
public void onDestroy() {
Log.i("service", "onDestroy");

mp.stop();
// TODO Auto-generated method stub
super.onDestroy();
}

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}

}


新建一个类MyService 继承Service,同时继承onCreate()  onStartCommand()  onDestroy()   onBind() 方法,


public void click(View view) {
Intent intent = new Intent(this, MyService.class);
switch (view.getId()) {
case R.id.startservice:
Toast.makeText(this, "start", Toast.LENGTH_SHORT).show();
startService(intent);  //启动服务
break;
case R.id.stopservice:
stopService(intent);  // 停止服务
break;
default:
break;
}
}


创建两个按钮,并相应的添加监听方法,实现对服务的启动和停止。

这里有一个很重要是事,服务是Android四大组件之一,所以必须在清单文件中注册,加入这句话

<service android:name="com.example.servicedome.MyService"></service>


这样,运行app,按下start后,就会启动服务,并播放音乐,此时如果关闭app,音乐依旧在播放。再次启动app并按下stop,音乐停止。到这里一个服务就完成了。

那么服务的生命周期如何呢,请看下图


图中左边为我们上面所写的一种Service,可以看到服务启动的顺序为onCreate()  onStartCommand() ,但当服务已经创建存在了,这时启动服务就只会运行 onStartCommand()  ,销毁时运行onDestroy()。

那么图片右边是干嘛的呢?这个是可以实现和Activity通信的另一种形式。暴力贴代码


package com.example.servicedome;


import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;


public class BoundService extends Service {


@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return new MyBinder();
}

@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
public void Down() {
Log.i("Bound-Service", "正在下载");

}

class MyBinder extends Binder {
public BoundService getMyService() {
return BoundService.this;
}
}
}


这里重新创建一个类继承Service,不同的是,多了点东西,不懂没关系,继续贴代码



还是不懂,没事继续贴代码


这个能用文字加代码实在是有点难说明白,直接一点的说呢,就是能够实现在Activity中的组件直接控制Service中的状态,具体的大家可以看看这个视频


http://www.imooc.com/video/6260   小白我语言组织能力比较差,没事,大家可以看视频 >-<


写到这里,服务这个组件基本上算是入门了。那么像酷狗那样的app有一个通知一直在通知栏显示的那种效果如何实现的呢?其实很简单,只要稍微改一下MyService中的onCreat() 方法就可以了,具体如下

  1. public class MyService extends Service {  
  2.   
  3.     public static final String TAG = "MyService";  
  4.   
  5.     private MyBinder mBinder = new MyBinder();  
  6.   
  7.     @Override  
  8.     public void onCreate() {  
  9.         super.onCreate();  
  10.         Notification notification = new Notification(R.drawable.ic_launcher,  
  11.                 "有通知到来", System.currentTimeMillis());  
  12.         Intent notificationIntent = new Intent(this, MainActivity.class);  
  13.         PendingIntent pendingIntent = PendingIntent.getActivity(this0,  
  14.                 notificationIntent, 0);  
  15.         notification.setLatestEventInfo(this"标题""通知的内容",  
  16.                 pendingIntent);  
  17.         startForeground(1, notification);  
  18.         Log.d(TAG, "onCreate() executed");  
  19.     }  
增加一个notification就可以,是不是很简单。

入门级的就到这啦。更加深入的大家可以去看一看其他大神的作品。


鄙人林小白,Android初级开发者,小白鼠一只,有志同道合的大侠们可以加我微信,共同学习探讨Android这只大猫


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值