Android教程:Android服务
Android系统中的服务是什么?
1)Faceless组件:在后台运行的Android系统组件是Service组件。
它们非常类似于活动,只是没有用户界面。
2)照顾长期运行的后台任务:它们执行应用程序所需的长期运行任务(无需用户干预)。
服务运行不需要用户界面的后台任务。
3)不受活动切换的影响:每个服务都有一个特定的工作,并且如果我们在不同的活动之间进行切换,或者即使我们完全切换到另一个应用程序,它们也会保留在该服务上。
4)它也可以为其他应用程序提供功能。
5)服务示例:音乐播放器就是一个很好的例子。
当我们使用播放列表在Android手机中播放音乐时,音乐播放器将自动完成工作,而无需用户干预。
我们不必在每首歌曲结束时都更改歌曲。
这种自动化归功于Android的服务组件。
Facebook应用程序中的服务组件
再次谈论Facebook应用程序,各种好友供稿和友谊通知等都是Services的示例。
无论我们是否与之交互,新朋友邀请总是在后台更新。
服务生命周期
现在让我们讨论服务生命周期。
由于服务缺少用户界面,因此它始终在后台运行(与活动不同)。
因此,其生命周期与Activity的生命周期略有不同。
我们会记得,活动可见时处于暂停状态,但用户未与之交互。
由于服务始终在后台运行,无论用户正在与哪个活动进行交互,因此暂停状态都是不可能的。
因此,服务具有以下阶段:
Starting
Running
Destroyed
服务形式
服务可以有两种形式:
1)已启动/未绑定:在这种情况下,应用程序组件将启动服务,并且即使启动该组件的原始组件已被破坏,它也将继续在后台运行。
例如,启动时,服务将无限期继续在后台播放音乐。
2)绑定:Android组件可以使用bindservice()将自身绑定到服务。
只要其他应用程序组件已绑定服务,绑定服务就会运行。
一旦解除绑定,该服务便会自行销毁。
未绑定的活动无限期运行,而绑定的活动的寿命取决于与其绑定的应用程序组件。
后台运行的服务何时被销毁?
即使(按定义)服务应无限期地执行长时间运行的操作,但如果它们在后台运行,注定最终会被Android系统杀死。
1)服务启动时,它将在主进程中运行:
创建服务时,服务不会为其本身创建单独的线程/进程(除非得到指示);而是在运行中的应用程序的主线程中运行,从而消耗了主系统的内存资源。
2)如果系统内存不足,该怎么办?
系统将选择关闭低优先级但仍在消耗系统资源的组件。
因此,不在用户关注范围内的后台组件是系统杀死的第一个组件。
因此,它将破坏在后台运行的服务。
这是为了释放系统资源以用于更重要的组件(例如:用于前台活动与用户交互)。
3)系统在终止服务以释放资源时是否遵循某种模式?
是的,它确实!
a)未绑定服务:随着时间的推移,系统会在后台任务列表中将长期运行的服务降低到较低的优先级,并且当发生内存不足时,该服务更有可能首先关闭(如果未绑定)。
b)绑定到前台活动的服务:绑定到活动或者在前台运行的任何其他应用程序组件的服务比未绑定的活动更容易被杀死。
c)前台服务:如果系统声明为在前台运行,则该系统永远不会终止该服务。
我们将在以后的Android教程中讨论更多有关此的内容。
别动!
4)如何防止服务被杀死?
a)我们可以在创建服务以运行服务时创建单独的线程。
因此,减少了主应用程序存储器的消耗,并且由于存储器不足而导致服务被破坏的可能性比其他情况要低。
b)如前所述,我们可以声明一个服务在前台运行。
这样可以防止系统终止服务。
Android教程:服务示例
由于这是初学者的Android教程,因此我们使用了最基本的服务示例,例如:Music Player。
以下是使用服务播放和停止歌曲的代码和快照:
请按照此Android教程中所述的步骤操作:
步骤1:使用类名称MainActivity创建一个新的Android项目。
第2步:在布局中添加两个按钮,并将其分别命名为play和stop。
步骤3:在MainActivity中设置两个按钮的onClick侦听器。
步骤4:创建一个新的类" MyService",并将其扩展到服务类
步骤5:在" res"目录中新建一个名为" raw"的文件夹,然后其中复制一首歌曲。
要添加列表的标签:
<service android:name=“.MyService” android:enabled=“true” > </service>
代码:MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button play, stop; play = (Button) findViewById(R.id.button1); stop = (Button) findViewById(R.id.button2); play.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent service = new Intent(MainActivity. this , MyService. class ); startService(service); } }); stop.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent name = new Intent(MainActivity. this , MyService. class ); stopService(name); } }); } }
代码:MyService.java
public class MyService extends Service { MediaPlayer mp; @Override public IBinder onBind(Intent arg0) { return null ; } @Override public void onCreate() { super .onCreate(); mp = MediaPlayer.create(getApplicationContext(), R.raw.song); } @Override public int onStartCommand(Intent intent, int flags, int startId) { mp.start(); return 0; } @Override public void onDestroy() { mp.release(); super .onDestroy(); } }