今天,继续进行我的行动计划,第二篇: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() 方法就可以了,具体如下
- public class MyService extends Service {
- public static final String TAG = "MyService";
- private MyBinder mBinder = new MyBinder();
- @Override
- public void onCreate() {
- super.onCreate();
- Notification notification = new Notification(R.drawable.ic_launcher,
- "有通知到来", System.currentTimeMillis());
- Intent notificationIntent = new Intent(this, MainActivity.class);
- PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
- notificationIntent, 0);
- notification.setLatestEventInfo(this, "标题", "通知的内容",
- pendingIntent);
- startForeground(1, notification);
- Log.d(TAG, "onCreate() executed");
- }
入门级的就到这啦。更加深入的大家可以去看一看其他大神的作品。
鄙人林小白,Android初级开发者,小白鼠一只,有志同道合的大侠们可以加我微信,共同学习探讨Android这只大猫