Android提高之Service用法实例解析

前面文章介绍了Activity以及Intent的使用,本文就来介绍Service。如果把Activity比喻为前台程序,那么Service就是后台程序,Service的整个生命周期都只会在后台执行。Service跟Activity一样也由Intent调用。在工程里想要添加一个Service,先新建继承Service的类,然后到AndroidManifest.xml -> Application ->Application Nodes中的Service标签中添加。

Service要由Activity通过startService 或者 bindService来启动,Intent负责传递参数。
 
 先贴出本文程序运行截图如下:

本文主要讲解Service的调用,以及其生命周期。

上图是startService之后再stopService的Service状态变化。

上图是bindService之后再unbindService的Service状态变化。

startService与bindService都可以启动Service,那么它们之间有什么区别呢?它们两者的区别就是使Service的周期改变。由startService启动的Service必须要有stopService来结束Service,不调用stopService则会造成Activity结束了而Service还运行着。bindService启动的Service可以由unbindService来结束,也可以在Activity结束之后(onDestroy)自动结束。

上图是startService之后再Activity.finish()的Service状态变化,Service还在跑着。

上图是bindService之后再Activity.finish()的Service状态变化,Service最后自动unbindService。

main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <Button android:layout_width="wrap_content"
 android:layout_height="wrap_content" android:id="@+id/btnStartMyService"
 android:text="StartMyService"></Button>
 <Button android:layout_width="wrap_content"
 android:layout_height="wrap_content" android:id="@+id/btnStopMyService"
 android:text="StopMyService"></Button>
 <Button android:layout_width="wrap_content"
 android:layout_height="wrap_content" android:id="@+id/btnBindMyService"
 android:text="BindMyService"></Button>
 <Button android:layout_width="wrap_content"
 android:layout_height="wrap_content" android:id="@+id/btnUnbindMyService"
 android:text="UnbindMyService"></Button>
 <Button android:layout_width="wrap_content"
 android:layout_height="wrap_content" android:id="@+id/btnExit"
 android:text="退出程序"></Button>
</LinearLayout>

testService.java的源码如下:

package com.testService;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class testService extends Activity {
  Button btnStartMyService,btnStopMyService,btnBindMyService,btnUnbindMyService,btnExit;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    btnStartMyService=(Button)this.findViewById(R.id.btnStartMyService);
    btnStartMyService.setOnClickListener(new ClickEvent());

    btnStopMyService=(Button)this.findViewById(R.id.btnStopMyService);
    btnStopMyService.setOnClickListener(new ClickEvent());

    btnBindMyService=(Button)this.findViewById(R.id.btnBindMyService);
    btnBindMyService.setOnClickListener(new ClickEvent());

    btnUnbindMyService=(Button)this.findViewById(R.id.btnUnbindMyService);
    btnUnbindMyService.setOnClickListener(new ClickEvent()); 

    btnExit=(Button)this.findViewById(R.id.btnExit);
    btnExit.setOnClickListener(new ClickEvent());
  }
  @Override
  public void onDestroy()
  {
   super.onDestroy();
   Log.e("Activity","onDestroy");
  }

  private ServiceConnection _connection = new ServiceConnection() {
 @Override
 public void onServiceConnected(ComponentName arg0, IBinder arg1) {
  // TODO Auto-generated method stub
 }

 @Override
 public void onServiceDisconnected(ComponentName name) {
  // TODO Auto-generated method stub
 }
  };
  class ClickEvent implements View.OnClickListener{

 @Override
 public void onClick(View v) {
  Intent intent=new Intent(testService.this,MyService.class);
  if(v==btnStartMyService){
  testService.this.startService(intent);
  }
  else if(v==btnStopMyService){
  testService.this.stopService(intent);
  }
  else if(v==btnBindMyService){
  testService.this.bindService(intent, _connection, Service.BIND_AUTO_CREATE);
  }
  else if(v==btnUnbindMyService){
  if(MyService.ServiceState=="onBind")//Service绑定了之后才能解绑
   testService.this.unbindService(_connection);
  }
  else if(v==btnExit)
  {
  testService.this.finish();
  }

 }

  }
}

MyService.java的源码如下:

package com.testService;

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

public class MyService extends Service {
 static public String ServiceState="";
 @Override
 public IBinder onBind(Intent arg0) {
 Log.e("Service", "onBind");
 ServiceState="onBind";
 return null;
 }
 @Override
 public boolean onUnbind(Intent intent){
 super.onUnbind(intent);
 Log.e("Service", "onUnbind");
 ServiceState="onUnbind";
 return false;

 }
 @Override
 public void onCreate(){
 super.onCreate();
 Log.e("Service", "onCreate");
 ServiceState="onCreate";
 }
 @Override
 public void onDestroy(){
 super.onDestroy();
 Log.e("Service", "onDestroy");
 ServiceState="onDestroy";
 }
 @Override
 public void onStart(Intent intent,int startid){
 super.onStart(intent, startid);
 Log.e("Service", "onStart");
 ServiceState="onStart";
 }

}
(0)

相关推荐

  • Android创建服务之started service详细介绍

    创建started service 应用组件(例如Activity)调用startService()来启动一个Service,将需要的参数通过Intent传给Service,Service将会在onStartCommand函数中获得Intent. 有两种方式可以创建started service,一种是扩展Service类,另外一种是扩展IntentService类 扩展Service       这是所有服务的基类.扩展这个类的时候,特别重要的一点是,需要创建一个新的线程来做服务任务,因为se

  • Android实现Service获取当前位置(GPS+基站)的方法

    本文实例讲述了Android实现Service获取当前位置(GPS+基站)的方法.分享给大家供大家参考.具体如下: 需求详情: 1).Service中每隔1秒执行一次定位操作(GPS+基站) 2).定位的结果实时显示在界面上(要求得到经度.纬度) 技术支持: 1).获取经纬度 通过GPS+基站获取经纬度,先通过GPS来获取,如果为空改用基站进行获取–>GPS+基站(基站获取支持联通.电信.移动). 2).实时获取经纬度 为了达到实时获取经纬度,需在后台启动获取经纬度的Service,然后把经纬度

  • Android Service 服务不被杀死的妙招

    Service是android 系统中的一种组件,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互. Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理. 从Android官方文档中,我们知道onStartCommand有4种int返回值,首先简单地讲讲int返回值的作用.

  • 解析Android中如何做到Service被关闭后又自动启动的实现方法

    首先要说的是,用户可能把这种做法视为流氓软件.大部分时候,程序员也不想把软件做成流氓软件,没办法,领导说了算. 我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行.而且,这些服务每次都会随着手机开机而启动.有的服务做的更绝,当用户在运行的服务中手动停止该服务以后,过了一段时间,服务又自动运行了.虽然,从用户的角度来说,这种方式比较流氓.但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种方式是可以实现的.下面就和大家分享. 先简单介绍,一会

  • Android中Service(后台服务)详解

    1.概念: (1).Service可以说是一个在后台运行的Activity.它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了. (2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示. (3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用. 2.作用: (1).它用于处理一些不干扰用户使用的后台操作.如下载,网络获取.播放音乐,他可以通过INTENT来开启,同时也可以绑定到宿主对象(调用者例如ACTIVITY上)来使用. (2).如果说

  • Android中实现开机自动启动服务(service)实例

    最近在将 HevSocks5Client 移植到 Android 上了,在经过增加 signalfd 和 timerfd 相关的系统调用支持后,就可以直接使用 NDK 编译出 executable 了.直接的 native exectuable 在 Android 系统总还是不太方便用哦.还是做成一个 apk 吧,暂定只写一个 service 并开机自动启用,无 activity 的. Java 中调用 native 程序我选择使用 JNI 方式,直接在 JNI_OnLoad 方法中调用 pth

  • Android实现Service重启的方法

    本文实例讲述了Android实现Service重启的方法.分享给大家供大家参考.具体如下: 做APP的时候,我们可能需要一个后台服务一直在运行着,得用到Service组件. 但服务可能在如下情况被杀死: A.用户手动点击停止. B.采用第三方软件(比如360手机卫士)进行清理,当然这样子除了系统服务外,其他的进程肯定也会被杀死,除非跟手机厂商联系. 这时候可能需要重启该服务,上网看了半天,有提到用Timer.AlarmManager去实现间歇性的发送广播启动Service(注册的广播接收后,启动

  • Android提高Service优先级的方法分析

    本文实例讲述了Android提高Service优先级的方法.分享给大家供大家参考,具体如下: Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用.当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存.这样就能保证真正对用户有用的程序仍然再运行.如果你的 Service 碰上了这种情况,多半会先被杀掉.但如果你增加 Service 的优先级就能让他多留一会,我们可以

  • Android四大组件之Service(服务)实例详解

    本文实例讲述了Android四大组件之服务用法.分享给大家供大家参考,具体如下: 很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用. 为了处理这种后台进程,Android引入了Service的概念.Service在Android中是一种长生命周期的组件,它不实现任何用户界面. 基本概念 Ÿ   Service是一种在后台运行,没有界面的组件,由其他组件调用开始. Ÿ   创建Service,定义类继承Service,An

  • Android应用程序四大组件之使用AIDL如何实现跨进程调用Service

    一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentProvider实现了不同应用之间的跨进程调用,但ContentProvider主要是提供数据的共享(如sqlite数据库),那么我们希望跨进程调用服务(Service)呢?Android系统采用了远程过程调用(RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言

  • Android的Service应用程序组件基本编写方法

    Service是什么 Service是一个android 系统中的应用程序组件,它跟Activity的级别差不多,但是他没有图形化界面,不能自己运行,只能后台运行,并且可以和其他组件进行交互如更新ContentProvider,Intent以及系统的通知等等.其启动方式有两种:context.startService() 和 context.bindService().Service通常用来处理一些耗时比较长的操作. Service的编写 创建一个类(这里为FirstService)继承andr

  • Android中的Service相关全面总结

    1.Service的种类 按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL.相应bindService会方便很多.  主进程被Kill后,服务便会终止.  非常常见的应用如:HTC的音乐播放服务,天天动听音乐播放服务. 远程服务(Remote) 该服务是独立的进程,  服务为独立的进程,对应进程名格式为所在包名

  • android开发教程之开机启动服务service示例

    个例子实现的功能是:1,安装程序后看的一个Activity程序界面,里面有个按钮,点击按钮就会启动一个Service服务,此时在设置程序管理里面会看的有个Activity和一个Service服务运行2,如果手机关机重启,会触发你的程序里面的Service服务,当然,手机启动后是看不到你的程序界面.好比手机里面自带的闹钟功能,手机重启看不到闹钟设置界面只是启动服务,时间到了,闹钟就好响铃提醒. 程序代码是: 首先要有一个用于开机启动的Activity,给你们的按钮设置OnClickListener

随机推荐