从Service的启动方式上,可以将Service分为Started Service和Bound Service。在使用Service时,要想系统能够找到此自定义Service,无论哪种类型,都需要在AndroidManifest.xml中声明:

<service android:name=".MyService">

一:StartService方式启动服务

Started Service相对比较简单,通过context.startService(Intent serviceIntent)启动Service,context.stopService(Intent serviceIntent)停止此Service。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.servicetest"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <service android:name=".MyService"> </service>
</application> </manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.servicetest.MainActivity"> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动服务"
android:id="@+id/btn_StartService" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服务"
android:id="@+id/btn_StopService" />
</LinearLayout>
MainActivity:
package com.example.servicetest;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button startService;
private Button stopService; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService=(Button)findViewById(R.id.btn_StartService);
stopService=(Button) findViewById(R.id.btn_StopService); startService.setOnClickListener(this);
stopService.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_StartService:
//启动服务
Intent intentStart=new Intent(MainActivity.this,MyService.class);
startService(intentStart);
break;
case R.id.btn_StopService:
//停止服务
Intent intentStop=new Intent(MainActivity.this,MyService.class);
stopService(intentStop);
break;
}
}
}
MyService:
package com.example.servicetest;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log; import java.text.SimpleDateFormat;
import java.util.Date; /**
* Created by xch on 2016/9/5.
*/
public class MyService extends Service{ private boolean flag=true; @Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate();
Log.i("tag","服务被创建!"); } @Override
public void onDestroy() {
super.onDestroy();
Log.i("tag","服务被销毁!");
new MyThread().setFlagFalse();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) { new MyThread().start(); return super.onStartCommand(intent, flags, startId);
} class MyThread extends Thread{
public void setFlagFalse(){
flag=false;
}
@Override
public void run() {
super.run(); while (flag){
//每隔一秒钟打印当前时间一次
//设置时间打印格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制
Date date=new Date();
String time=sdf.format(date);
Log.i("date",time);
try {
//沉睡1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

二. BoundService方式启动服务

bindService启动流程: context.bindService()  ——> onCreate()  ——> onBind()  ——> Service running  ——> onUnbind()  ——> onDestroy()  ——> Service stop

MainActivity:
package com.example.servicetest2;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button bindService,unBindService;
private Intent intent;
private MyServiceConn conn=new MyServiceConn(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); bindService=(Button)findViewById(R.id.btn_BindService);
unBindService=(Button)findViewById(R.id.btn_UnBindService); bindService.setOnClickListener(this);
unBindService.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_BindService:
intent=new Intent(MainActivity.this,MyService.class);
bindService(intent,conn, Context.BIND_AUTO_CREATE);
break;
case R.id.btn_UnBindService:
intent=new Intent(MainActivity.this,MyService.class);
unbindService(conn);
break;
}
}
private class MyServiceConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//在服务绑定成功的时候执行
} @Override
public void onServiceDisconnected(ComponentName name) {
//当服务所在的进程被杀死,或崩溃的时候执行
}
}
}
MyService:
package com.example.servicetest2;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log; import java.text.SimpleDateFormat;
import java.util.Date; /**
* Created by xch on 2016/9/7.
*/
public class MyService extends Service {
private boolean flag=true;
private MyThread thread=new MyThread(); @Nullable
@Override
public IBinder onBind(Intent intent) {
thread.start();
return null;
} @Override
public void onCreate() {
Log.i("service","服务被创建!");
super.onCreate();
} @Override
public void onDestroy() {
super.onDestroy();
Log.i("service","服务被销毁!");
thread.setFlagFalse();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
} class MyThread extends Thread{
public void setFlagFalse(){
flag=false;
} @Override
public void run() {
super.run();
while (flag){
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
Log.i("date",sdf.format(date));
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
}
}

三.Service与Activity之间通讯

BoundService可以实现,但是startService没有这个特点。这里需要注意的是,利用bindService启动的Service无法获取这个Service对象,所以这里需要在Service中将对象返回,既然有返回就需要接收。so,看代码:

MyService:
package com.example.servicetest2;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log; import java.text.SimpleDateFormat;
import java.util.Date; /**
* Created by xch on 2016/9/7.
*/
public class MyService extends Service {
private boolean flag=true;
private MyThread thread;
private String format="yyyy-mm-dd HH:mm:ss"; //更改系统时间的输出格式
public void setFormat(String format){
this.format=format;
} public void changeFormat(String format){
if(thread!=null){
//调用方法,更改时间输出格式
setFormat(format);
}
} @Nullable
@Override
public IBinder onBind(Intent intent) {
thread.start();
//将代理类返回回去
return new ServiceBinder();
} @Override
public void onCreate() {
Log.i("service","服务被创建!");
thread=new MyThread();
super.onCreate();
} @Override
public void onDestroy() {
super.onDestroy();
Log.i("service","服务被销毁!");
thread.setFlagFalse();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
} class MyThread extends Thread{
public void setFlagFalse(){
flag=false;
} @Override
public void run() {
super.run();
while (flag){
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat(format);
Log.i("date",sdf.format(date));
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} /**
* 当前服务的代理类,即可使用changeFormat()方法
* 需要通过IBinder将这个代理类返回回去,即onBinder()方法
*/
public class ServiceBinder extends Binder{
public void changeServiceBinder(String format){
if(thread!=null){
changeFormat(format);
}
} }
}

这里需要在service中定义一个代理类,并利用onBinder()方法返回去。

MainActivity:

package com.example.servicetest2;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button bindService,unBindService,changeFormat;
private Intent intent;
private MyServiceConn conn=new MyServiceConn();
//接收到的service对象
private MyService.ServiceBinder serviceBinder; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); bindService=(Button)findViewById(R.id.btn_BindService);
unBindService=(Button)findViewById(R.id.btn_UnBindService);
changeFormat=(Button)findViewById(R.id.btn_changeFormat); bindService.setOnClickListener(this);
unBindService.setOnClickListener(this);
changeFormat.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_BindService:
intent=new Intent(MainActivity.this,MyService.class);
bindService(intent,conn, Context.BIND_AUTO_CREATE);
break;
case R.id.btn_UnBindService:
intent=new Intent(MainActivity.this,MyService.class);
unbindService(conn);
break;
case R.id.btn_changeFormat:
serviceBinder.changeServiceBinder("HH:mm:ss");
break;
}
}
private class MyServiceConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//在服务绑定成功的时候执行,同时接收到了IBinder对象(类型为代理类对象,因为onBinder方法返回了代理类对象)
serviceBinder= (MyService.ServiceBinder) service;
} @Override
public void onServiceDisconnected(ComponentName name) {
//当服务所在的进程被杀死,或崩溃的时候执行
}
}
}

这里实现了ServiceConnection接口的自定义类需要实现如上两个方法,其中onServiceConnected(ComponentName name, IBinder service)方法能获取onBinder()返回的service对象。

 结果:


Android学习总结——Service组件的更多相关文章

  1. Android中的Service组件具体解释

    Service与Activity的差别在于:Service一直在后台执行,他没实用户界面,绝不会到前台来. 一,创建和配置Service 开发Service须要两个步骤:1.继承Service子类,2 ...

  2. 我有一壶酒 Android学习之Service(1)--->BinderService方式

    本文只讨论扩展Binder类 创建一个Binder.xml <?xml version="1.0" encoding="utf-8"?> <L ...

  3. Android学习之Service(1)--->Started方式

    界面退出后进程程序还在运行,不会被杀死,如音乐播发器.后台下载等 注:本文只讨论Started方式 main.xml代码分析 <?xml version="1.0" enco ...

  4. 【Android学习】Service&Boradcast初步

    Service初步 掌握Service概念 掌握Service分类 Service开发能力具备 了解Service和intentService类的区别 重点难点 StartService和BoundS ...

  5. Android 学习笔记 Service服务与远程通信...(AIDL)

    PS:这一章节看的我有几分迷茫,不是很容易理解...不过还好总算是明白了一大半了...基本的迷惑是解决了... 学习内容: 1.跨应用启动服务... 2.跨应用绑定服务... 3.跨应用实现通信... ...

  6. Android 学习笔记 Service

    PS:前几篇的内容光是上代码了,也没有细细的讲解..感觉这样写很不好..因此还是多一些讲解吧... 学习内容: 1.了解Service... 2.Service的启动与停止.. 3.绑定与取消绑定Se ...

  7. android学习笔记 Service

    Service(服务): 长期后台运行的没有界面的组件 android应用什么地方需要用到服务? 天气预报:后台的连接服务器的逻辑,每隔一段时间获取最新的天气信息.股票显示:后台的连接服务器的逻辑,每 ...

  8. Android学习笔记⑧——UI组件的学习AdapterView相关2

    前面都是用ListView控件来配合Adapter做的一些实例,这次我们来见识一下GridView与Adapter之间的爱恨情仇.... GridView是用于在界面上按行.列分布的方式来显示多个的组 ...

  9. Android学习笔记⑦——UI组件的学习AdapterView相关1

    AdapterView是一个非常重要的组件之一,他非常灵活,所以得好好学...AdapterView本身是一个抽象类,派生出来的子类用法也十分相似,只是界面有一定的区别,因此本节把他们归为一类 Ada ...

随机推荐

  1. 将字符串变成大写----C++实现

    虽然这个题目很简单,但是也是会范很多错误的,平时你肯定知道,但是在编程的时候就是容易犯傻,而且八匹马都拽不回来... 看来还是要多写写代码..不废话了. 直接贴代码.. #include<ios ...

  2. 计算机图形学学习方法和相关书籍,做游戏,GIS,虚拟现实,三维引擎的都能够看看.

    本书參照<<图形学扫盲>> 整理的,原文内容引子: http://www.cppblog.com/lai3d/archive/2008/12/30/70796.html 前言: ...

  3. markdown 书写代码

    近期基于github + hexo 搭建了自己的博客.開始用markdown写博客,推荐 mac 平台用 mou 这个软件或者 vim. 介绍下markdown语法插入代码的规则: 有一种方法是全部代 ...

  4. 利用Unicorn和Idaemu辅助解决Geekpwn SecretCode

    在前面的些文章里,我提到了怎么交叉编译Unicorn-engine,以及在windows上使用Unicorn python bindings进行分析程序.这一次我介绍下如何使用Unicorn-engi ...

  5. 第四课 Grid Control实验 安装JCH2库并且配置好监听,关键步骤和结果截图

      --从OCM 虚拟机中,克隆了安装oracle之前的状态 配置网络: [root@localhost network-scripts]# ifup ifcfg-eth0 [root@localho ...

  6. nginx配置文件(反向代理+集群+动静分离)

    1.nginx纯反向代理配置(nginx.conf): #user nobody;worker_processes 4;error_log logs/error.log info;pid logs/n ...

  7. @synthesize

    @synthesize 相当于把属性当成成员变量来用,不用再写self.属性@synthesize myButton; 这样写了之后,那么编译器会自动生成myButton的实例变量,以及相应的gett ...

  8. maven配置spring mvc+hibernate+spring框架

    作为一名刚出茅草屋的新手小白写的框架,仅适合新手小白借鉴,大神勿喷,谢谢...... 前天刚知道spring mvc这个框架现在也很流行,决定用它代替struts2来写我的毕业设计. ...作为一名新 ...

  9. deepin 2014 静态IP无法保存,临时方法

    打开终端: #临时添加静态IP ifconfig eth0 [ip] netmask [掩码] #添加默认网关 route add default gw [网关] #添加DNS vim /etc/re ...

  10. MVC 过滤

    我们来看两个接口: public interface IActionFilter { // Methods void OnActionExecuted(ActionExecutedContext fi ...