Android服务详解:生命周期、启动方法与AIDL应用

需积分: 16 1 下载量 14 浏览量 更新于2024-07-27 收藏 843KB DOC 举报
第8章深入探讨Android服务 Android服务是应用程序四大组件之一(其余包括Activity、BroadcastReceiver和ContentProvider),其核心功能是提供后台运行和跨进程通信的能力。服务主要应用于那些不需显示界面但持续运行的任务,如网络数据下载、视频播放控制等。 8.1 Service起步 服务启动流程的关键在于理解其生命周期。Service没有显式用户界面,它的工作通常发生在后台。Service的生命周期由以下几个关键阶段构成: - **启动(Start)**:服务通过startService()或bindService()方法启动,这时服务开始运行但不一定立即执行任务,取决于startCommand()方法中的命令。 - **运行(Running)**:当服务被启动后,它进入运行状态,执行预定义的任务。如果任务完成后,服务会进入停滞状态。 - **暂停(Stopping)**:当调用stopService()或系统根据需求停止服务时,服务进入暂停状态,但仍保存上下文和数据。 - **销毁(Destroying)**:如果长时间无请求且系统内存紧张,服务可能被系统自动销毁,或者开发者手动调用stopSelf()并清除引用。 8.1.1 Service的生命周期管理 为了更好地控制服务的生命周期,开发者需要理解service.onStartCommand()方法,它接收一个Intent对象,决定如何处理请求,并返回一个结果码(ResultCode)来告知客户端处理结果。常见的模式有START_STICKY(服务重启后自动恢复)、START_NOT_STICKY(服务结束)等。 8.1.2 绑定Activity与Service 服务可以通过bindService()方法与Activity进行交互,这种绑定允许Activity请求特定服务的操作,并在需要时更新UI。绑定完成后,可以通过onServiceConnected()回调与Service进行通信,解绑则通过unbindService()。 8.1.3 在BroadcastReceiver中启动Service BroadcastReceiver能够触发服务的启动,例如在接收到特定广播事件时,通过sendBroadcast()或sendOrderedBroadcast()来启动Service执行相应的响应操作。 8.2 系统服务 这部分涵盖了如何获取系统级别的服务,如传感器服务(如8.2.2节中的模拟重力感应)和管理设备设置的TelephonyManager等。这些服务通常在Android框架内部运行,对开发者权限有较高要求。 8.3 时间服务 服务还用于管理时间和计时任务,如Chronometer用于实时计时,Handler和AlarmManager用于定时任务。AlarmManager支持定期任务的调度,包括延迟执行(8.3.5节)、周期性执行(分段详述)等。 8.4 AIDL服务 AIDL(Android Interface Definition Language)是Android中的一种机制,用于进程间通信(IPC)。8.4.1节介绍了AIDL服务的概念,8.4.2至8.4.3节详细阐述了创建AIDL服务的步骤,包括定义接口、编译生成接口类以及在服务端和客户端的实现。 8.5 本章总结 通过学习本章内容,开发者将掌握如何有效地设计、启动、管理和终止服务,以及利用各种服务特性如绑定、系统服务、时间管理和AIDL通信,以实现更加灵活和高效的Android应用程序设计。同时,理解服务的生命周期管理对于确保应用性能和资源优化至关重要。
2023-05-12 上传

activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg"> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="90dp" android:text="开启服务" android:layout_above="@+id/btn_stop" android:layout_centerHorizontal="true" android:background="#B0E0E6" android:textSize="18sp" android:onClick="start"/> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="关闭服务" android:layout_alignParentBottom="true" android:layout_alignLeft="@+id/btn_start" android:layout_alignStart="@+id/btn_start" android:layout_marginBottom="20dp" android:background="#F08080" android:textColor="#6C6C6C" android:textSize="18sp" android:onClick="stop"/> </RelativeLayout> MainActivity package com.example.startservice; import android.content.Intent; import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 开启服务 public void start(View view){ Intent intent = new Intent(this,MyService.class); startService(intent); } // 关闭服务 public void stop(View view){ Intent intent = new Intent(this,MyService.class); stopService(intent); } } MyService package com.example.startservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); Log.i("StartService","onCreate()"); } @Override public int onStartCommand(Intent intent,int flags, int startId) { Log.i("StartService","onStartCommand()"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.i("StartService","onDestroy()"); } } AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.startservice"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService" android:enabled="true" android:exported="true"></service> </application> </manifest>实验步骤

2023-06-03 上传