- 浏览: 184956 次
- 性别:
- 来自: 浙江
文章分类
最新评论
参考链接: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 982使用第三方jar: autobahn-0.5.0.jar 连 ... -
Comparator自定义排序的使用
2017-05-11 14:18 748java对于集合的自定义排序方法有: Arrays.sort ... -
查看Android虚拟机文件相关命令
2017-05-02 14:12 593我们在虚拟机下添加文件后,想查看下文件是否正确创建,可在win ... -
android6.0创建文件问题
2017-05-02 12:58 586Android在6.0有了动态权限管理,在文件创建时就需要动态 ... -
xutils的http模块的简单使用
2017-04-28 16:05 521先导入xutils相关依赖: compile 'org.xut ... -
Litepal的简单使用
2017-04-27 17:21 639相关包下载地址:https://github.com/Lite ... -
Android下拉刷新上拉加载控件的使用
2017-04-21 10:46 849参考链接:http://www.jianshu.com/p/6 ... -
图片加载框架
2017-04-19 16:29 402图片加载框架: picasso ImageLoader -
解决ViewPager的addOnPageChangeListener不加载第一个的问题
2017-03-18 17:53 2641今天在使用ViewPager的时候发现个问题。 需求如下: ... -
clone方法的使用
2017-01-04 10:14 552由于Java有引用这一说,当两个变量指向同一块内存时,改变 ... -
Fragment无法切换问题
2016-12-16 14:57 2111Android有一个回收机制,当内存不足时,会自动回收相关内存 ... -
关于Material Design的CollapsingToolbarLayout初次使用
2016-12-16 13:38 611最近了解了下CollapsingToolbarLayout的使 ... -
MVP模式的学习
2016-12-10 15:15 669以前我写代码都是使用MVC模式,这种模式使Activity变得 ... -
Material Design:Android Design Support Library 介绍
2016-12-10 14:14 468参考链接 : https://blog.leancloud.c ... -
SpannableString简介
2016-12-10 14:03 423参考链接: http://www.cnblogs.com/ji ... -
getResources().getDrawable方法的废弃
2016-12-10 13:20 1222参考链接:http://www.jianshu.com/p/e ... -
关于AndroidStudio的Unsupported major.minor version 52.0异常
2016-12-10 13:15 2376参考链接:http://blog.csdn.net/fakin ... -
Android记录
2015-06-01 10:54 637http://tools.android-studio.org ... -
android自定义控件相关使用
2015-04-24 16:53 610用代码简单介绍下自定义控件的使用: 先看主activity: ... -
android使用html标签
2015-03-13 20:42 707有些时候我们需要在一个textview上,对部分字体进行特殊效 ...
相关推荐
一篇对于android service的详细总结
Android Service是Android操作系统中的一个重要组件,用于在后台长时间运行任务,即使用户界面已经关闭。Service不同于线程,尽管它们都可以用于执行后台操作,但Service提供了更高级别的抽象和与应用程序交互的能力...
总结来说,`Service`和`Activity`之间的数据传递可以通过Intent参数、BroadcastReceiver或Binder实现。BroadcastReceiver适用于不频繁的数据交换,而Binder适合需要频繁交互且在同一个进程的情况。开发者应根据具体...
总结起来,Android Service提供了多种启动方式,根据应用场景选择合适的方式可以优化性能和用户体验。启动方式适用于无需频繁交互的后台任务,绑定方式适用于需要与Service紧密交互的情况,线程方式确保Service不会...
总结起来,`Start Service`在Android中主要用于执行后台任务,它不会直接与启动它的组件进行交互,而是独立运行。理解并正确使用`Start Service`对于开发能够后台运行的应用至关重要。在实际项目中,根据需求选择...
总结来说,“android service”是Android开发中的核心概念,它支持后台运行,是实现持久化操作的关键。通过深入学习Service的源码,结合各种工具进行调试和分析,开发者可以更高效地利用Service实现复杂的功能,同时...
总结来说,"Android Service Demo"是一个学习如何在Android应用中实现后台服务的实例。它涵盖了Service的创建、启动、绑定和生命周期管理,对于理解Android服务的工作原理及其在实际应用中的使用非常有帮助。通过...
本示例"Android Service大总结Demo"将深入探讨Service的使用,包括如何启动、绑定服务,以及实现跨进程间的通信。我们将详细讲解以下几个关键知识点: 1. **Service的基本概念**: - Service是一种没有用户界面的...
在Android应用开发中,Service和Activity是两个非常重要的组件,它们各自扮演着不同的角色。Service主要负责在后台执行长时间运行的任务,而Activity则用于与用户交互。本示例"Android Service与Activity交互"旨在...
总结起来,理解并掌握Service的启动方式和生命周期管理是Android开发中的重要环节。在实际应用中,根据需求选择合适的启动模式,并确保服务的运行效率和用户体验。通过`com.njupt.zhb.MusicPlay`这样的练习,可以...
总结来说,Android远程服务是实现跨进程通信的重要手段,通过AIDL和Binder机制,我们可以构建出高效、稳定的服务架构。正确理解和运用远程服务,可以为Android应用开发带来更大的灵活性和扩展性。在实际开发中,根据...
总结来说,这个项目通过`Notification`、`Service`和`BroadcastReceiver`实现了后台文件下载并实时通知用户的功能。`Notification`提供用户界面反馈,`Service`负责文件下载,`BroadcastReceiver`监听并处理下载状态...
总结一下,`startService()`是Android中启动服务的关键方法,适用于需要后台长期运行的任务。理解并正确使用服务可以极大地增强你的应用功能,但也要注意资源管理,避免过度消耗设备资源。通过学习和实践`Android_...
总结来说,要在Android Service中弹出对话框,需要创建一个兼容Service的Context,使用新线程或Handler来显示Dialog,并根据Service的生命周期进行适当的管理。对于复杂的需求,可以考虑使用DialogFragment。同时,...
总结来说,`startService()`是Android中启动服务的一种方式,适用于执行非交互的后台任务。在使用时,需要正确处理Service的生命周期方法,确保服务在必要时启动和停止,并遵循Android的后台服务最佳实践,以提供...
总结起来,Android中的Bound Service是一种允许应用程序组件与服务进行交互的服务类型,通过`IBinder`接口进行通信,提供了一种更加灵活且高效的服务使用方式。理解并熟练掌握Bound Service的实现和使用,对于开发...
总结起来,Start Service是Android中用于启动后台任务的重要工具,正确理解和使用它可以提升应用的用户体验,但同时也需要注意资源管理和生命周期管理,以保证应用的稳定性和效率。在`ServiceDemo`项目中,我们可以...
总结一下,Android的Service组件用于执行后台任务,可以通过startService()和stopService()控制其生命周期。Service与外部通信依赖于Binder和IBinder,通过实现IBinder接口,Service可以暴露自己的方法供其他组件...
总结来说,Android Service根据其启动模式和使用场景有不同的行为和生命周期管理。开发者需要根据实际需求选择合适的启动模式,并注意系统对后台服务的限制。在设计Service时,应尽量减少对CPU和内存的占用,避免...
总结,Android中的Service绑定是一种有效的通信方式,适用于需要频繁交互和控制Service的情况。理解并正确运用Service绑定机制,能够提升应用的功能性和用户体验。在实际开发中,应根据需求选择合适的服务启动方式,...