- 浏览: 181062 次
- 性别:
- 来自: 浙江
文章分类
最新评论
参考链接:http://www.cnblogs.com/lwbqqyumidi/p/4181185.html
Android上经常会碰到Service,用到的都比较零散,今天比较全面的了解了下。
Service也是组件之一,如需使用,需要在清单文件中注册。代码如下:
<service
android:exported=["true" | "false"]
android:icon="drawable resource"
android:name="string"
android:process="string" >
. . .
</service>
上面是用到较多的几个属性,name为服务类,process为进程名。exported是否允许远程调用。
下面是简单的实现service类:
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service {
public static final int MSG_SEND_TO_SERVER = 1;
public static final int MSG_SEND_TO_CLIENT = 2;
private Messenger mClientMessenger;
private Messenger mServerMessenger = new Messenger(new ServerHandler());
private static int mark =1;
@Override
public IBinder onBind(Intent intent) {
return mServerMessenger.getBinder();
}
class ServerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SEND_TO_SERVER:
mClientMessenger = msg.replyTo;
Message toClientMsg = Message.obtain(null, MSG_SEND_TO_CLIENT);
toClientMsg.obj = "来自Service:" + mark;
try {
mClientMessenger.send(toClientMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
mark++;
break;
default:
super.handleMessage(msg);
}
}
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.e("123","onDestroy");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
}
Activity调用service简单代码如下:
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView tvRecord;
private Button btnBindService;
private Button btnStartService;
private Button btnSend;
private Button btnUnBindService;
private Button btnStopService;
private ServiceConnection sc = new MyServiceConnnect();
private boolean isConnnect =false;
private Messenger mServerMessenger;
private Handler mClientHandler = new MyClientHandler();
private Messenger mClientMessenger = new Messenger(mClientHandler);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
setListener();
}
private void setListener(){
btnBindService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, sc, Context.BIND_AUTO_CREATE);
}
});
btnStartService.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
}
});
btnSend.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
send();
}
});
btnStopService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyService.class);
stopService(intent);
}
});
btnUnBindService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isConnnect) {
unbindService(sc);
isConnnect = false;
}
}
});
}
private void send(){
if (!isConnnect){
return;
}
Message msg = Message.obtain(null, MyService.MSG_SEND_TO_SERVER);
msg.replyTo = mClientMessenger;
try {
mServerMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
private void findView(){
tvRecord = (TextView)findViewById(R.id.tv_record);
btnBindService = (Button) findViewById(R.id.btn_bind);
btnStartService = (Button)findViewById(R.id.btn_start);
btnSend = (Button)findViewById(R.id.btn_send);
btnStopService = (Button)findViewById(R.id.btn_stop);
btnUnBindService = (Button)findViewById(R.id.btn_unbind);
}
class MyClientHandler extends Handler{
@Override
public void handleMessage(Message msg) {
if (msg.what == MyService.MSG_SEND_TO_CLIENT) {
String obj = (String)msg.obj;
tvRecord.setText(obj);
}
}
}
class MyServiceConnnect implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mServerMessenger = new Messenger(service);
isConnnect =true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
isConnnect =false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
一般启动服务有两方法:startService和bindService。
startService比较简单,通过stopService结束。当服务已经启动,则不会调用oncreate方法,直接调用onStartCommand。startCommand的返回值意义如下:
START_NOT_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,即使系统内存足够可用,系统也不会尝试重新创建此Service。除非程序中Client明确再次调用startService(...)启动此Service。
START_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,当系统内存足够可用的情况下,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand(...)方法,但其中的Intent将是null,pendingintent除外。
START_REDELIVER_INTENT:与START_STICKY唯一不同的是,回调onStartCommand(...)方法时,其中的Intent将是非空,将是最后一次调用startService(...)中的intent。
START_STICKY_COMPATIBILITY:compatibility version of {@link #START_STICKY} that does not guarantee that {@link #onStartCommand} will be called again after being killed。此值一般不会使用,所以注意前面三种情形就好。
bindService也可启动服务,可通过unbindService结束,此方法可通过接口,通过信使通信。具体代码如上。如通过bindservice启动的服务,需关闭所有的依赖才可结束服务。
Android上经常会碰到Service,用到的都比较零散,今天比较全面的了解了下。
Service也是组件之一,如需使用,需要在清单文件中注册。代码如下:
<service
android:exported=["true" | "false"]
android:icon="drawable resource"
android:name="string"
android:process="string" >
. . .
</service>
上面是用到较多的几个属性,name为服务类,process为进程名。exported是否允许远程调用。
下面是简单的实现service类:
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service {
public static final int MSG_SEND_TO_SERVER = 1;
public static final int MSG_SEND_TO_CLIENT = 2;
private Messenger mClientMessenger;
private Messenger mServerMessenger = new Messenger(new ServerHandler());
private static int mark =1;
@Override
public IBinder onBind(Intent intent) {
return mServerMessenger.getBinder();
}
class ServerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SEND_TO_SERVER:
mClientMessenger = msg.replyTo;
Message toClientMsg = Message.obtain(null, MSG_SEND_TO_CLIENT);
toClientMsg.obj = "来自Service:" + mark;
try {
mClientMessenger.send(toClientMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
mark++;
break;
default:
super.handleMessage(msg);
}
}
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.e("123","onDestroy");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
}
Activity调用service简单代码如下:
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView tvRecord;
private Button btnBindService;
private Button btnStartService;
private Button btnSend;
private Button btnUnBindService;
private Button btnStopService;
private ServiceConnection sc = new MyServiceConnnect();
private boolean isConnnect =false;
private Messenger mServerMessenger;
private Handler mClientHandler = new MyClientHandler();
private Messenger mClientMessenger = new Messenger(mClientHandler);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
setListener();
}
private void setListener(){
btnBindService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, sc, Context.BIND_AUTO_CREATE);
}
});
btnStartService.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
}
});
btnSend.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
send();
}
});
btnStopService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyService.class);
stopService(intent);
}
});
btnUnBindService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isConnnect) {
unbindService(sc);
isConnnect = false;
}
}
});
}
private void send(){
if (!isConnnect){
return;
}
Message msg = Message.obtain(null, MyService.MSG_SEND_TO_SERVER);
msg.replyTo = mClientMessenger;
try {
mServerMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
private void findView(){
tvRecord = (TextView)findViewById(R.id.tv_record);
btnBindService = (Button) findViewById(R.id.btn_bind);
btnStartService = (Button)findViewById(R.id.btn_start);
btnSend = (Button)findViewById(R.id.btn_send);
btnStopService = (Button)findViewById(R.id.btn_stop);
btnUnBindService = (Button)findViewById(R.id.btn_unbind);
}
class MyClientHandler extends Handler{
@Override
public void handleMessage(Message msg) {
if (msg.what == MyService.MSG_SEND_TO_CLIENT) {
String obj = (String)msg.obj;
tvRecord.setText(obj);
}
}
}
class MyServiceConnnect implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mServerMessenger = new Messenger(service);
isConnnect =true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
isConnnect =false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
一般启动服务有两方法:startService和bindService。
startService比较简单,通过stopService结束。当服务已经启动,则不会调用oncreate方法,直接调用onStartCommand。startCommand的返回值意义如下:
START_NOT_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,即使系统内存足够可用,系统也不会尝试重新创建此Service。除非程序中Client明确再次调用startService(...)启动此Service。
START_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,当系统内存足够可用的情况下,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand(...)方法,但其中的Intent将是null,pendingintent除外。
START_REDELIVER_INTENT:与START_STICKY唯一不同的是,回调onStartCommand(...)方法时,其中的Intent将是非空,将是最后一次调用startService(...)中的intent。
START_STICKY_COMPATIBILITY:compatibility version of {@link #START_STICKY} that does not guarantee that {@link #onStartCommand} will be called again after being killed。此值一般不会使用,所以注意前面三种情形就好。
bindService也可启动服务,可通过unbindService结束,此方法可通过接口,通过信使通信。具体代码如上。如通过bindservice启动的服务,需关闭所有的依赖才可结束服务。
发表评论
-
关于Android的webSocket的简单使用
2017-05-12 14:34 920使用第三方jar: autobahn-0.5.0.jar 连 ... -
Comparator自定义排序的使用
2017-05-11 14:18 711java对于集合的自定义排序方法有: Arrays.sort ... -
查看Android虚拟机文件相关命令
2017-05-02 14:12 517我们在虚拟机下添加文件后,想查看下文件是否正确创建,可在win ... -
android6.0创建文件问题
2017-05-02 12:58 540Android在6.0有了动态权限管理,在文件创建时就需要动态 ... -
xutils的http模块的简单使用
2017-04-28 16:05 479先导入xutils相关依赖: compile 'org.xut ... -
Litepal的简单使用
2017-04-27 17:21 594相关包下载地址:https://github.com/Lite ... -
Android下拉刷新上拉加载控件的使用
2017-04-21 10:46 791参考链接:http://www.jianshu.com/p/6 ... -
图片加载框架
2017-04-19 16:29 361图片加载框架: picasso ImageLoader -
解决ViewPager的addOnPageChangeListener不加载第一个的问题
2017-03-18 17:53 2581今天在使用ViewPager的时候发现个问题。 需求如下: ... -
clone方法的使用
2017-01-04 10:14 513由于Java有引用这一说,当两个变量指向同一块内存时,改变 ... -
Fragment无法切换问题
2016-12-16 14:57 2069Android有一个回收机制,当内存不足时,会自动回收相关内存 ... -
关于Material Design的CollapsingToolbarLayout初次使用
2016-12-16 13:38 571最近了解了下CollapsingToolbarLayout的使 ... -
MVP模式的学习
2016-12-10 15:15 612以前我写代码都是使用MVC模式,这种模式使Activity变得 ... -
Material Design:Android Design Support Library 介绍
2016-12-10 14:14 421参考链接 : https://blog.leancloud.c ... -
SpannableString简介
2016-12-10 14:03 382参考链接: http://www.cnblogs.com/ji ... -
getResources().getDrawable方法的废弃
2016-12-10 13:20 1158参考链接:http://www.jianshu.com/p/e ... -
关于AndroidStudio的Unsupported major.minor version 52.0异常
2016-12-10 13:15 2333参考链接:http://blog.csdn.net/fakin ... -
Android记录
2015-06-01 10:54 602http://tools.android-studio.org ... -
android自定义控件相关使用
2015-04-24 16:53 569用代码简单介绍下自定义控件的使用: 先看主activity: ... -
android使用html标签
2015-03-13 20:42 638有些时候我们需要在一个textview上,对部分字体进行特殊效 ...
相关推荐
一篇对于android service的详细总结
本文主要介绍Android Service的知识,这里整理了详细资料及简单实现示例代码,有需要的小伙伴可以参考下
Android Service大总结Demo 包括跨进程之间的通信。详情请参考博客
Android实现双进程守护,如何保证Service不被Kill,onStartCommand方法,返回START_STICKY,手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,比较不错,但是不能保证...
Android之Service学习总结收集.pdf
本项目将Android中的Intent总结了一遍。主要有四个项目,Intent_Intent项目是简单的Intent跳转(setActivityResult);Intent_broadcast主要是静态广播的注册;Intent_broadcastdynamic主要介绍动态广播的注册;...
service的启动,停止,绑定,取消绑定,以及IntentService的生命周期走向测试和IntentService与访问者信息通信过程,不清楚之处请参阅我的博客《Android开发四大组件之Service总结》
这是一个关于Service与Activity通信的部分代码,及如何使用Service和Activity通信。
主要介绍了Android Service 服务的详细资料,网上关于Android Service 服务的文章比较多,但是不是很全面,不够细致,毕竟是Android 四大组件之一,重要性不用说,这里总结下,需要的朋友可以参考下
AndroiBLE开发总结: 在Android BLE开发中,设备、服务、特征和描述它们之间的关系如下: - 设备(Device):指BLE设备,如蓝牙耳机、传感器等。 - 服务(Service):指BLE设备所提供的服务,一个BLE设备可以提供多...
最近在开发中我们经常会在适配5.0以后的机型遇到各种各样的问题,其中有一个不大不小的问题就是:Toast不显示问题,这篇文章就给大家总结了Android 5.0以上Toast不显示的原因与解决方法,有需要的朋友们可以参考借鉴...
全面总结Android Service的使用方法,具体内容如下 1、Service的种类 按运行地点分类: 其实remote服务还是很少见的,并且一般都是系统服务。 按运行类型分类: 有同学可能会问,后台服务我们可以自己创建 ...
关于android activityManagerService的总结
16. android客户端调用web service 63 Android开发讲课流程.doc; Android简介 3 第一章 搭建Android开发环境 4 第二章 Android工程目录介绍 9 第三章 电话拨号器和发送短信小程序 12 第四章 日志输出和单元测试 17...
巩固和学习了更多的Android的控件、布局、Activity、Service等一系列基础知识,对整个Android的开发有了大致的了解。android入门后,只会照着别人的葫芦来画瓢,即没有设计思想,也没有自主原创的代码,不好不好 ...
采用案例驱动模式展开讲解知识点,即介绍案例->案例涉及技术->展开知识点->总结的方式 本书作者从事多年一线开发和培训,讲解知识点力求细致,深入浅出 目 录 前言 第1章 Android操作系统概述 1 1.1 Android...
这篇总结是通过学习android源码情景分析得来的,是学习第二章HAL层的心得笔记,我学的比较浅,自己总结的知识,从硬件驱动到硬件抽象层到硬件服务到应用等的介绍
关于ANR原理的透彻总结,简单易懂
安卓开发学习的各种资料以及对应的demo 开源客户端学习研究 准备通过这个客户端深入学习。...深入理解Android的startservice和bindservice Android Studio权威教程专栏 各种源码解析分析 值得阅读的android技术文章