android Service 的使用

mac2025-06-20  8

1 Service 简介

Service 是Android 四大组件之一 一般在后台运行,无用户界面,用户无法看到。

Service主要用于组件之间交互(例如:与Activity、ContentProvider、BroadcastReceiver进行交互)、后台执行耗时操作等(例如下载文件,播放音乐等,但Service在主线程运行时长不能超过20s,否则会出现ANR,耗时操作一般建议在子线程中进行操作)。

2 Service 模式

Service启动模式主要分两种: 1. 启动模式。 2. 绑定模式。

启动模式的生命周期为 StartService--> onCreate---> onStartCommand-->onDestory 

绑定模式的生命周期为 BindService--->onCreate--->onBind--->onUnBind---->onDestory

3 代码介绍Service的使用

先看下启动服务

3.1 创建的服务要继承Service 

3.2 必须在Androidmainfest.xml 中注册 

下面看看代码-----写一个简单的开启与关闭服务

//启动服务 findViewById(R.id.start).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); startService(intent); } }); //关闭服务 findViewById(R.id.close).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); stopService(intent); } });

然后我们在看看创建的MyService 代码 

public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.e("----------服务创建","111111111111"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e("----------服务调用","111111111111"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.e("----------服务销毁","111111111111"); } }

代码里面有一个onBind 这个无论是启动服务还是绑定服务都会存在的,在启动服务里面不用关返回null就行

在绑定服务里面可以返回要绑定的内容

最后别忘记在配置文件中注册了

<service android:name=".MyService" />

配置文件的属性如下

 <service android:name=".Myservice"             android:enabled="true"             android:exported="true"             android:icon="@drawable/background_blue"             android:label="string"             android:process="string"             android:permission="string">  </service> android:exported    表示是否允许除了当前程序之外的其他程序访问这个服务 android:enabled    表示是否启用这个服务 android:permission    是权限声明 android:process    是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。 android:isolatedProcess     设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(bind and start)。

绑定服务

//绑定服务 findViewById(R.id.bind).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, BindService.class); bindService(intent, conn, Service.BIND_AUTO_CREATE); } }); //解绑服务 findViewById(R.id.unbind).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { unbindService(conn); } });

bindService 里面有三个参数 第三个是一个标记,个人理解为绑定看下其代码

public class MainActivity extends AppCompatActivity { private ServiceConnection conn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { BindService.MyBinder binder = (BindService.MyBinder) service; binder.start(); binder.end(); } @Override public void onServiceDisconnected(ComponentName name) { } }; } }

绑定的服务

public class BindService extends Service { //初始化自定义的Binder对象 private MyBinder mBinder = new MyBinder(); public class MyBinder extends Binder { public void start() { Log.e("----------start", "start:"); } public void end() { Log.e("-----------end", "end:"); } } @Override public void onCreate() { super.onCreate(); Log.e("------------hxm", "onCreate"); } @Nullable @Override public IBinder onBind(Intent intent) { Log.e("------------hxm", "IBinder"); return mBinder; } @Override public boolean onUnbind(Intent intent) { Log.e("------------hxm", "onUnbind"); return super.onUnbind(intent); } @Override public void onDestroy() { super.onDestroy(); Log.e("------------hxm", "onDestroy"); } }

个人写一个demo 点击查看吧  

参考文章

https://mp.weixin.qq.com/s?__biz=MzU4MTIzMjM3MA==&mid=2247484827&idx=2&sn=80212d30ef757afccd0e601ce73f14a1&scene=21#wechat_redirect

https://blog.csdn.net/weixin_39460667/article/details/82770164

胡小牧 认证博客专家 Android Java 小程序 岁月推动着年华,伴随着流水的脚步走过春夏秋冬。回想一路走来磕磕绊绊,感谢前辈们的无私奉献,本文重在共享,欢迎大家转载,评论,指教,点赞,谢谢,如果您对文章存在疑问,或者和您的文章类似,请私信,----------------期待是心痛的根源,心不动,则不痛。
最新回复(0)