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 ...
随机推荐
- es6(三set和map数据结构)
es6中提供了一个新的数据结构Set,他有点类似数组,但和数组不同的是,在里面你如果写入重复的值的话,他不会显示重复值. const s =new Set(); [2,3,4,5,6,6,6,7,8, ...
- 28. TRIGGERS ,29. USER_PRIVILEGES,30. VIEWS
28. TRIGGERS TRIGGERS表提供有关触发器的信息.要查看有关表的触发器的信息,您必须具有该表的TRIGGER权限. TRIGGERS表有以下列: TRIGGER_CATALOG :触发 ...
- Django框架基础知识07-常用查询及表关系的实现
1.常用的模型字段类型 https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types 2.字段的常用参数 官方文档:http ...
- 【HIHOCODER 1604】股票价格II(堆)
描述 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 在小Hi的策略中,每天可以在下列三种操作中选取一种: 1.什么也不做: 2.按照当天的价格买进一个单位的 ...
- LeetCode 467. Unique Substrings in Wraparound String
Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...
- Pychorm提示Unresolved reference 导入模块报错
最近使用Pychorm编写Python时,每次要引入自定义模块,就会报错,提示“Unresolved reference” Unresolved reference 'LoginClass' more ...
- NYOJ 239 月老的难题
月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福 ...
- HaHa's Morning(状压DP)
描述 HaHa is so happy today, he is going to participate the 7th Hunan University Programming Contest. ...
- [bzoj1787][Ahoi2008]Meet 紧急集合(lca)
传送门 可以看出,三个点两两之间的lca会有一对相同,而另一个lca就是聚集点. 然后搞搞就可以求出距离了. ——代码 #include <cstdio> #include <cst ...
- Atlantis(hdu1542)
题意:求n个矩阵的面积并. /* 线段树维护扫描线 把每个矩形看成两条线段,从左到右添加线段,如果是矩形左边的线段,那就给线段所在的区间(y值)cover+1,反之则cover-1. 并且如果这条线段 ...