Android四大组件之:service

原创 2016年08月28日 20:27:45

    今天,继续进行我的行动计划,第二篇: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这只大猫


Android 四大组件之Service的Demo

  • 2015年12月18日 14:11
  • 7.14MB
  • 下载

Android四大组件之Service

一、Service简介 Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。Service是Andr...

关于Android中的四大组件(AIDL Service的使用)

跨进程调用Service(AIDL Service) Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。 在前一篇文章(关于Android中的四大组...

Android四大组件--Service,后台播放背景音乐

MainActivity.Java package com.example.week5_day1_servicebind; import com.example.week5_day1_servic...

Android四大组件Service之两种的多线程启动方式

由于Service常常用于处理比较耗时的后台服务,在不适用多线程时,所有的组件服务都是在主线程中执行的,必然会影响用户体验和整体性能,下面是两种启动Service线程的方式。 第一种方法:在Ser...

Android 四大组件之特殊Service(IntentService)的使用

在Service中,通常是不需要同时处理多个请求的,在这种情况下,使用IntentService或许是最好的选择。为什么呢?下面的这个问题给出了答案。 IntentService如何使用?和Se...

android开发步步为营之37:四大组件之Service(上)通过startService(intent)启动

写过windows service的人都知道,windows service是一个运行在后台看不见的服务,它默默地处理着业务,android 的service也一样,它运行在后台,前台是看不见的,我们...

Android四大组件之------Service(本地服务小案例)

很多童鞋被Service的本地服务与远程服务所困扰,下面就写一个小Demo来展示本地服务跟远程服务的区别:一、概念:本地服务是Service对象与Service的启动者在同个进程中运行, 两者的通信是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android四大组件之:service
举报原因:
原因补充:

(最多只允许输入30个字)