Android项目之HomeHealth基础学习2:Service
一、 Service简单介绍
Service是android 系统中的四大组件之中的一个(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别几乎相同,但不能自己执行仅仅能后台执行,而且能够和其它组件进行交互。service能够在非常多场合的应用中使用,比方播放多媒体的时候用户启动了其它Activity这个时候程序要在后台继续播放。比方检測SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等。总之服务总是藏在后台的。
Service的启动有两种方式:context.startService() 和 context.bindService()
二、 Service启动流程
context.startService() 启动流程:
context.startService() -> onCreate() -> onStart() -> Service running -> context.stopService() -> onDestroy() -> Service stop
假设Service还没有执行。则android先调用onCreate(),然后调用onStart();
假设Service已经执行,则仅仅调用onStart()。所以一个Service的onStart方法可能会反复调用多次。
假设stopService的时候会直接onDestroy。假设是调用者自己直接退出而没有调用stopService的话。Service会一直在后台执行,该Service的调用者再启动起来后能够通过stopService关闭Service。
所以调用startService的生命周期为:onCreate --> onStart (可多次调用)
--> onDestroy
context.bindService()启动流程:
context.bindService() -> onCreate() -> onBind() -> Service running -> onUnbind() -> onDestroy() -> Service stop
onBind()将返回给client一个IBind接口实例,IBind同意client回调服务的方法。比方得到Service的实例、执行状态或其它操作。这个时候把调用者(Context,比如Activity)会和Service绑定在一起。Context退出了,Srevice就会调用onUnbind->onDestroy对应退出。
所以调用bindService的生命周期为:onCreate --> onBind(仅仅一次,不可多次绑定) --> onUnbind --> onDestory。
在Service每一次的开启关闭过程中,仅仅有onStart可被多次调用(通过多次startService调用),其它onCreate,onBind。onUnbind,onDestory在一个生命周期中仅仅能被调用一次。

三、 Service生命周期
Service的生命周期并不像Activity那么复杂,它仅仅继承了onCreate()、onStart()、onDestroy()三个方法
当我们第一次启动Service时。先后调用了onCreate()、onStart()这两个方法;当停止Service时,则运行onDestroy()方法。
这里须要注意的是,假设Service已经启动了,当我们再次启动Service时,不会在运行onCreate()方法,而是直接运行onStart()方法。
它能够通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己,仅仅要调用一次stopService()方法便能够停止服务。不管调用了多少次的启动服务方法。
四、 代码演示样例
(1)startService演示样例
project包含两个类:MainActivity.java,PlayService.java
当中:MainActivity.java定义了两个button。分别控制音乐的播放与停止。
用startService和stopService完毕Activity与Service之间的切换,启动Service以及取消Service,假设不用button。能够在Activity的OnCreate和OnDestrpy里面启动和取消Service
AndroidManifest.xml文件例如以下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.serviceactivity"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <service android:enabled="true" android:name=".PlayService" />
</application> </manifest>
layout布局文件activity_main.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <Button
android:id="@+id/button_on"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="open"/> <Button
android:id="@+id/button_off"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/button_on"
android:text="close"/> <TextView
android:id="@+id/txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/button_off"
android:text="we will via"
/> </RelativeLayout>
MainActivity.java代码例如以下:
package com.example.hellowendy; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
Button buttonOn, buttonOff;
String TAG = "ServiceActivity"; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); buttonOn = (Button) findViewById(R.id.button_on);
buttonOff = (Button) findViewById(R.id.button_off); buttonOn.setOnClickListener(this);
buttonOff.setOnClickListener(this);
Log.v(TAG, "ActivityonCreate");
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) { case (R.id.button_on):
Log.v(TAG, "ActivitystartService");
this.startService(new Intent(this, PlayService.class));
// startService(new Intent(this, PlayService.class)); break;
case (R.id.button_off): {
Log.v(TAG, "ActivitystopService");
this.stopService(new Intent(this, PlayService.class));
// stopService(new Intent(this, PlayService.class)); }
break; default:
break; } } @Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.v(TAG, "ActivityonStop");
} @Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.v(TAG, "ActivityonDestroy");
super.onDestroy(); } }
PlayService.java代码例如以下:
/**
*
*/
/**
* @author Administrator
*
*/
package com.example.hellowendy; import java.io.IOException; import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast; public class PlayService extends Service {
String TAG = "ServiceActivity";
MediaPlayer mediaPlayer; @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} @Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Toast.makeText(this, "Play Service Created", Toast.LENGTH_LONG).show();
Log.v(TAG, "ServiceonCreate"); //TextView txtview; //txtview = (TextView) findViewById(R.id.txt); <span style="white-space:pre"> </span>//从本地资源中获取的歌曲cong.mp3, “匆匆那年”,<span style="color:#ff0000;font-family: 'black Verdana', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;">cong.mp3文件夹是hellowendy -> res</span><span style="font-family: 'black Verdana', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;"><span style="color:#ff0000;"> ->raw -> cong.mp3</span></span>
mediaPlayer = MediaPlayer.create(this, R.raw.cong);
} @Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
//super.onStart(intent, startId);
//super.onStart();
/*
* //能够在OnCreate里面创建与音乐的链接。也能够在OnStart里面创建 mediaPlayer =
* MediaPlayer.create(this, R.raw.test);
*/
Toast.makeText(this, "Play Service onStart", Toast.LENGTH_LONG).show();
Log.v(TAG, "ServiceonStart");
mediaPlayer.start();
} @Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Toast.makeText(this, "Play Service Stopped", Toast.LENGTH_LONG).show();
Log.v(TAG, "ServiconDestroy");
mediaPlayer.stop();
} }
Android项目之HomeHealth基础学习2:Service的更多相关文章
- Android项目开发第四周学习总结
Android项目开发实战第四周 在本周,我们进行了Android项目第四周的项目开发,在本周,我们对原有的项目进行改进,我们的想法是使项目在原有的基础上增加一些新的功能,使得txt阅读器可以更加先进 ...
- [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图
关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇 ...
- 1) 十分钟学会android--建立第一个APP,创建android项目
一个Android项目包含了所有构成Android应用的源代码文件. 本小节介绍如何使用Android Studio或者是SDK Tools中的命令行来创建一个新的项目. Note:在此之前,我们应该 ...
- Android 学习笔记 Service服务与远程通信...(AIDL)
PS:这一章节看的我有几分迷茫,不是很容易理解...不过还好总算是明白了一大半了...基本的迷惑是解决了... 学习内容: 1.跨应用启动服务... 2.跨应用绑定服务... 3.跨应用实现通信... ...
- Java基础学习笔记二十八 管家婆综合项目
本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...
- [原]零基础学习视频解码之android篇系列文章
截止今天,<零基础学习视频解码系列文章>.<零基础学习在Android进行SDL开发系列文章>以及<零基础学习视频解码之android篇>系列文章基本算是告一段落了 ...
- [原]零基础学习在Android进行SDL开发系列文章
[原]零基础学习SDL开发之移植SDL2.0到Android [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 [原]零基础学习SDL开发之在Android使用SDL2.0显示 ...
- Android 学习笔记 Service
PS:前几篇的内容光是上代码了,也没有细细的讲解..感觉这样写很不好..因此还是多一些讲解吧... 学习内容: 1.了解Service... 2.Service的启动与停止.. 3.绑定与取消绑定Se ...
- cocos2d-x学习之旅(五):1.5 使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机
今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2d-x ...
随机推荐
- vue计算属性computed和methods的区别
computed和methods的区别 在new Vue的配置参数中的computed和methods都可以处理大量的逻辑代码,但是什么时候用哪个属性,要好好区分一下才能做到正确的运用vue. com ...
- 交叉编译OpenCV的教程——基于aarch64-linux-gnu的交叉编译器
1.获取OpenCV3.3.1的源码 地址:https://pan.baidu.com/s/1lnKDThiWg-2QDXNEzVAqrA 提取码:vmn4 2.解压源码包 命令:unzip open ...
- C#对象初始化的探讨
最近在弄MQ的性能监测数据埋点,无疑中用到一个Nstatsd的客户端,看到里面写过里面一种嵌套类的写法.代码如下: 客户端Client是一个密封的类,并且构造函数私有访问.然后又用一个嵌套类Curre ...
- linux系统日志中出现大量systemd Starting Session ### of user root 解决
这种情况是正常的,不算是一个问题 https://access.redhat.com/solutions/1564823 Environment Red Hat Enterprise Linux 7 ...
- 页面布局排版-block,inline,float,relative,absolute等
1.span和div的区别 div是块元素(block),span是行内元素(inline): span什么事也不会做,它存在的目的在与为开发者给它所围绕的元素指定样式.div类似,不过它引入了行分隔 ...
- 夯实Java:从面向对象说起
作者:伯特出处:github.com/ruicbAndroid/LoulanPlan声明:本文出自伯特的<LoulanPlan>,转载务必注明作者及出处. 刚学习 Java 那会就接触了& ...
- MyBatis 3 分页
利用MyBatis 3进行分页,选定的数据库表c_province,有3列,id列,provinceid列,province列,用Oracle数据库.首先建立一个对应的实体类,Province有3个属 ...
- python自定义模块导入方法,文件夹,包的区别
python模块导入,网上介绍的资料很多,方法也众说纷纭.根据自己的实践,感觉这个方法最简单直接,而且可以与主流的python ide生成的工程是一样的. 规则只有三条 1. 严格区分包和文 ...
- hdu1160简单dp最长下降子序列
/* 简单dp,要记录顺序 解:先排序,然后是一个最长下降子序列 ,中间需记录顺序 dp[i]=Max(dp[i],dp[j]+1); */ #include<stdio.h> #incl ...
- 【BZOJ2982】combination(Lucas定理)
题意:求C(n,m) n,m<=200000000 思路:c(n,m)=c(n mod mo,m mod mo)*c(n div mo,m div mo) mod mo (n>=mo或m& ...