Android菜鸟的成长笔记(16)——Service简介
Service是Android四大组件之一
1、Service与Activity的区别在:Service一直在后台运行,没有用户界面。
2、选择Activity与Service的标准:如果某个程序组件需要在运行时向用户呈现某种界面,或者改程序需要和用户进行交互,就需要用Activity,否则需要考虑使用Service.
3、Android系统本身提供了大量的Service组件,开发者可以通过Service来操作Android系统。
4、Service组件有自己的生命周期。
5、Service与Activity都是从Context派生而来的,都可以调用Context里面定义的如getResources()、getContentResolver()等方法。
下面我们来先创建一个Service并启动
(1)定义一个继承Service的子类。
package com.example.testservice; import android.app.Service;
import android.content.Intent;
import android.os.IBinder; public class FirstService extends Service{ @Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
} @Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("onCreate");
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println("onStartCommand");
return super.onStartCommand(intent, flags, startId); } @Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("onDestroy");
} }
注意:上面的onBind()方法是必须实现的方法。
(2)在AndroidMainfest.xml文件中配置该Service
<service android:name=".FirstService">
<intent-filter >
<action android:name="com.meritit.service.FIRST_SERVICE"/>
</intent-filter>
</service>
如果希望Service组件做某些事情,只要在onCreate()或onStartCommand()方法中定义相关业务代码即可。
(3)运行Service
运行Service的方法有两种:
a: 通过Context的startService()方法:通过该方法启动Service,访问者与Service之间没有关联,即使访问者退出了,Service任然运行。
b:通过Context的bindService()方法:使用该方法启动Service,访问者与Service绑定在了一起,访问者一旦退出,Service也就终止了。
下面先通过第一种方式运行Service
package com.example.testservice; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity {
private Button start;
private Button stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //获取程序界面中的start、stop两个按钮
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop); final Intent intent = new Intent();
intent.setAction("com.meritit.service.FIRST_SERVICE"); start.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
startService(intent);
}
}); stop.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
stopService(intent);
}
});
}
}
从上面代码中可以看出,启动、关闭Service非常容易,只需要调用Context里面定义的startService()方法和stopService()方法。
连续单击“启动Service"按钮,程序将会连续多次启动Service,LogCat如图:
从图中我们可以看出,onCreate方法只被调用了一次,这说明:每次Service被第一次启动调用onCreate()方法,多次启动已经启动的Service组件将不会再回调onCreate()方法啊,但每次启动时都会回调onStartCommand()方法,这样就可以根据不同的业务需求将业务代码放在onCreate()方法或onStartCommand()方法中。下图是Service的生命周期,因为比较简单所以就不叙述过程了。
下一篇将介绍:绑定本地Service并与之通信
Android菜鸟的成长笔记(16)——Service简介的更多相关文章
- Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service
原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...
- Android菜鸟的成长笔记(7)——什么是Activity
原文:[置顶] Android菜鸟的成长笔记(7)——什么是Activity 前面我们做了一个小例子,在分析代码的时候我们提到了Activity,那么什么是Activity呢? Activity是An ...
- Android菜鸟的成长笔记(4)——你真的理解了吗?
原文:Android菜鸟的成长笔记(4)--你真的理解了吗? 在上一篇中我们查看了QQ的apk源文件中的布局结构,并仿照QQ完成了我们第一个应用的界面,详细请看<Android菜鸟的成长笔记&g ...
- Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy
原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...
- Android菜鸟的成长笔记(2)——第一个Android应用
原文:Android菜鸟的成长笔记(2)--第一个Android应用 上一篇:Android菜鸟的成长笔记(1)--Anddroid环境搭建从入门到精通 在上一篇Android菜鸟的成长笔记(1)中我 ...
- Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通
原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...
- Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)
原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...
- Android菜鸟的成长笔记(13)——异步任务(Async Task)
原文:[置顶] Android菜鸟的成长笔记(13)——异步任务(Async Task) Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(App ...
- Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...
- Android菜鸟的成长笔记(11)——Android中的事件处理
原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的 ...
随机推荐
- vue使用(二)
本节目标: 1.数据路径的三种方式 2.{{}}和v-html的区别 1.绑定图片的路径 方法一:直接写路径 <img src="http://p ...
- Nginx系列(二)--模块化
高度模块化的设计设Nginx架构的基础. 在Nginx中,除了少量的核心代码,其它一切皆为模块.模块化设计具有下面特点: 1.高度抽象的模块接口 2.灵活性 3.配置模块的设计使Nginx提供了高可配 ...
- 页面中如何引用外部的HTML(四种方法)
页面中如何引用外部的HTML(四种方法) 一.总结 一句话总结:a.iframe标签 b.ajax引入代码片段 c.link import的方法导入 d.re ...
- ArcSDE:C#打开SDE数据库的几种方式总结
转自原文 ArcSDE:C#打开SDE数据库的几种方式总结 1.通过指定连接属性参数打开数据库 /// <param name="server">数据库服务器名< ...
- 计算机图形学(二)输出图元_3_画线算法_2_DDA算法
DDA算法 数字微分分析仪(digital differential analyzer, DDA)方法是一种线段扫描转换算法.基于使用等式(3.4)或等式(3.5)计算的&x或& ...
- [TypeStyle] Use TypeStyle keyframes to create CSS animations
We cover CSS keyframes and how to create them using TypeStyle. We then show how to use the keyframes ...
- 教你写Http框架(二)——三个样例带你深入理解AsyncTask
这个标题大家不要奇怪,扯Http框架怎么扯到AsyncTask去了,有两个原因:首先是Http框架除了核心http理论外.其技术实现核心也是线程池 + 模板 + handler,而AsyncTask又 ...
- php实现判断树的子结构
php实现判断树的子结构 一.总结 很简单的递归判断 二.php实现判断树的子结构 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 三.代码 代 ...
- Need ffmpeg exe. You can download it by calling: imageio.plugins.ffmpeg.download()
该问题 Need ffmpeg exe. You can download it by calling: imageio.plugins.ffmpeg.download()往往出现在在调用 impor ...
- [CSS] Design for Mobile First with Tachyons
Tachyons provides extensions (-ns, -m, and -l) to many of its classes to help you design for respons ...