`

Android Service分析

 
阅读更多

package com.improve.service;

import java.util.Random;

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

/**
 * 因为Service由主线程执行,耗时操作应该创建独立线程
 * @author Davee
 */
public class AnalysedService extends Service {
	private static final String TAG = "ServiceAnalysis";
	public static final String AUTO_STOP = "auto_stop";

	private final Random mRandom = new Random();

	@Override
	public void onCreate() {
		Log.i(TAG, "onCreate");
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.i(TAG, "onStartCommand  flags: " + flags + "  startId: " + startId);
		if (AUTO_STOP.equals(intent.getAction())) {
		    doLastThing();
		}
		/*
                          返回值告诉Android系统当这个Service被Kill之后(比如当系统内存不足时)后续操作,
		  START_STICKY 表示系统Kill这个Service之后,
		                 如果重新创建这个Service时在调用onStartCommand,不会将最后的Intent作为参数传入
		  START_REDELIVER_INTENT 则会传入被杀前未处理的最后一个Intent
		*/
		return START_STICKY;
	}

	@Override
	public IBinder onBind(Intent intent) {
		Log.i(TAG, "onBind");
		return localBinder;
	}

	@Override
	public boolean onUnbind(Intent intent) {
		Log.i(TAG, "onUnbind");
		return true;
	}
	
	@Override
	public void onRebind(Intent intent) {
		Log.i(TAG, "onRebind");
	}
	
	@Override
	public void onDestroy() {
		Log.i(TAG, "onDestroy");
	}
	
	private final LocalBinder localBinder = new LocalBinder();
	public class LocalBinder extends Binder {
		public AnalysedService getService() {
			return AnalysedService.this;
		}
	}
	
	/**
	 * 提供这个方法用个来与客户端(Activity)交互
	 * @return
	 */
	public int getRandomInt() {
		Log.i(TAG, "getRandomInt");
		return mRandom.nextInt(100);
	}
	
	/**
	 * 执行完本方法就停止本服务
	 */
	public void doLastThing() {
		Log.i(TAG, "doLastThing");
		//假设这里下载一个文件,这是个耗时操作
		new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				//文件下载完成后停止本服务
				AnalysedService.this.stopSelf();//Service有绑定时不能自动停止,调用无效
			}
		}.start();
	}
}

 

package com.improve;

import com.improve.service.AnalysedService;
import com.improve.service.AnalysedService.LocalBinder;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class ServiceAnalysis extends Activity {
	private final String TAG = "ServiceAnalysis";

	private AnalysedService analysedService;
	
	private ServiceConnection sc = new ServiceConnection() {
		/*
		     绑定连接建立时调用
		 */
	    @Override
		public void onServiceConnected(ComponentName cn, IBinder binder) {
			Log.i(TAG, "onServiceConnected");
			LocalBinder localBinder = (LocalBinder)binder;
			analysedService = localBinder.getService();
		}

		/*
		     在Service意外断开时调用(如Service进程崩溃)
		     这个例子不会调这个方法,因为它在同一进程中运行
		  unbindService方法不会调用此方法
		 */
		@Override
		public void onServiceDisconnected(ComponentName cn) {
			Log.i(TAG, "onServiceDisconnected");
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.service_analysis);
		
		Button start = (Button)findViewById(R.id.service_start);
		Button stop = (Button)findViewById(R.id.service_stop);
		Button bind = (Button)findViewById(R.id.service_bind);
		Button unbind = (Button)findViewById(R.id.service_unbind);
		Button interact = (Button)findViewById(R.id.service_interact);
		Button lastThing = (Button)findViewById(R.id.service_last_thing);
		
		//每次点击都会调用Service的onStartCommand方法
		start.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				Intent intent = new Intent(ServiceAnalysis.this, AnalysedService.class);
				ServiceAnalysis.this.startService(intent);
			}
		});

		//没有开启Service之前调用没意义,但不会有异常
		stop.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				Intent intent = new Intent(ServiceAnalysis.this, AnalysedService.class);
				ServiceAnalysis.this.stopService(intent);
			}
		});

		//只会在未绑定时调用Service方法
		bind.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
			    /*
			                 绑定是异步实现的,因此需要通过 ServiceConnection接口来监视与Service之间的连接
			     */
				Intent intent = new Intent(ServiceAnalysis.this, AnalysedService.class);
				ServiceAnalysis.this.bindService(intent, sc, Context.BIND_AUTO_CREATE);
			}
		});

		unbind.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
			    //没有bindService之前调用会抛异常,因此调用前需要判断是否绑定
				ServiceAnalysis.this.unbindService(sc);
			}
		});
		
		interact.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
			    //只要之前调用过Bind(即使又调用了Unbind),就可以调用服务中的方法
				Toast.makeText(ServiceAnalysis.this, "从Service取到的整数为 "+analysedService.getRandomInt(), Toast.LENGTH_SHORT).show();
			}
		});
		
		lastThing.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
			    Intent intent = new Intent(AnalysedService.AUTO_STOP);
			    intent.setClass(ServiceAnalysis.this, AnalysedService.class);
                ServiceAnalysis.this.startService(intent);
			}
		});
	}
}
 
分享到:
评论

相关推荐

    android service 简单实例源代码

    在Android开发中,Service是四大组件之一,它在后台运行,不与用户界面直接交互,常用于执行长时间的任务,如播放音乐、网络通信等。本篇文章将深入解析"android service 简单实例源代码",帮助你理解如何在Android...

    android service toast 01

    开发者可以通过阅读和分析这些代码来学习如何在Service中正确地使用Toast,同时理解多线程和UI更新的规则。 此外,了解如何调试和跟踪Service中的问题也是很重要的。Android Studio提供了强大的工具,如Logcat,...

    Android Service Framework分析

    对Android Service Framework进行简单的剖析

    Android Service深入解析Demo

    通过以上分析,我们可以了解到Service在Android应用开发中的重要性,以及如何合理地使用和管理Service。实际开发中,开发者应结合具体需求,灵活运用Service的各种特性,提高应用的稳定性和效率。

    Android service

    在Android应用开发中,"Service" 是一个非常重要的组件,它允许程序在后台长时间运行,即使用户已经离开了应用程序。在给定的标题"Android service"中,我们可以理解为讨论的是如何利用Android服务来实现特定的功能...

    android service

    本篇我们将深入探讨“android service”这个主题,结合提供的标签“源码”和“工具”,我们将分析Service的工作原理、如何创建及使用,以及相关的开发工具。 首先,Service的生命周期是由系统管理和控制的,主要...

    Android 多个service的action 相同冲突 验证demo

    在Android开发中,Service是应用程序组件之一,用于在后台执行长时间运行的操作,即使用户与应用程序交互界面不直接关联。在某些情况下,我们可能需要启动多个Service来执行不同的任务,但问题在于,如果这些Service...

    Android Service Demo

    在Android应用开发中,Service是四大组件之一,用于在后台执行长时间运行的操作,即使用户界面关闭仍然可以...通过深入研究和分析这个Demo,开发者能够更好地掌握Android服务的运用,从而提高应用的性能和用户体验。

    android service 源码

    Service的源码分析对于深入理解Android系统的工作原理和优化应用性能至关重要。本篇将详细介绍Android Service的源码学习及其关键知识点。 首先,我们来了解Service的基本生命周期。在Android中,Service的启动与...

    Android Service实现断点下载

    通过分析这些代码,开发者可以更深入地理解如何在实际项目中实现Service驱动的断点续传下载功能。记得在实际开发中,还要考虑内存管理、多任务并发控制、下载速度优化等其他因素,以提升整体性能和用户体验。

    android核心分析pdf

    **Android核心分析(09):** Zygote Service是Android系统中负责创建应用程序进程的关键服务。这部分内容讲解了Zygote进程的创建机制及其如何为后续的应用程序提供初始环境。 #### 八、GWES基本原理 **Android核心...

    Service-Demo-android.zip_DEMO_android service_android service de

    通过分析这个DEMO,开发者不仅能学习到如何创建和管理Service,还能理解如何在实际应用中处理与Service相关的各种情况,例如处理长时间运行的任务、交互式服务和保持Service的可见性等。这个DEMO是学习和实践Android...

    Android不死Service

    在文件"TestUnDead"中,可能是包含了一个测试不死Service的示例代码,通过查看和分析这个代码,我们可以更具体地了解上述策略是如何实施的。这包括Service类的定义、BroadcastReceiver的配置、进程设置、通知创建...

    android startService分析

    以上就是对Android中`startService`的详细分析。理解并恰当使用`startService`对于开发高效且用户体验良好的Android应用至关重要。在实际开发中,要根据需求选择合适的服务类型,同时注意性能优化和电池消耗,以提供...

    Android之Service实现比较大小

    本篇文章将深入探讨Android中的Service,分析不同类型的Service及其特性,并对比它们之间的差异。 首先,我们要了解Service的两种主要类型:`START_STICKY`和`START_NOT_STICKY`。这两种启动模式对Service的行为...

    Android_Service1

    在Android应用开发中,`Service` 是一个非常重要的组件,它允许应用程序在后台长时间运行,即使用户与应用程序的交互界面已经关闭。这篇博客"Android_Service1"深入探讨了`Service`的相关知识,以下是对这些知识点的...

    android-Service的2种应用

    本篇文章将深入探讨Service的两种主要应用:`startService`和`bindService`,并结合提供的源码分析进行详细解释。 首先,`startService`是启动一个Service的方式,它适合那些不需要与启动Service的应用组件直接交互...

    2011.09.01(3)——— android service startService bindService

    在Android应用开发中,`Service` 是一个非常重要的组件,用于执行长时间运行的操作,比如后台音乐播放、网络通信等。本篇文章将详细讲解 `startService` 和 `bindService` 这两种启动 `Service` 的方式,以及它们...

    Android停止Service的例程

    本教程将深入探讨如何正确地停止一个Android Service,同时结合源码分析其内部机制。 首先,理解Service的生命周期至关重要。Service的启动有两种方式:startService()和bindService()。startService()用于启动一个...

    Android Service的启动过程分析

    在Android系统中,Service是一种关键组件,用于在后台执行长期运行的任务,比如音乐播放或后台数据同步。然而,Service并不是一个独立的线程,而是运行在应用程序的主线程上,这意味着如果你在Service中直接执行耗时...

Global site tag (gtag.js) - Google Analytics