服务: 长期后台运行的没有界面的组件
android应用:什么地方需要用到服务?
天气预报:后台的连接服务器的逻辑,每隔一段时间 获取最新的天气信息
股票显示:后台的连接服务器的逻辑,每隔一段时间 获取最新的股票信息
mp3播放器: 后台长期的播放音乐。
new Thread(){}.start(); 子线程没有界面,也是长期后台运行的。
android系统进程管理是按照一定的规则的:
1.应用程序一旦被打开 通常情况下关闭(清空任务栈)后进程不会停止。方便下一次快速启动。
带来内存不足的问题。
2.Android系统有一套 内存清理机制。 按照优先级去回收系统的内存。
进程分为5个等级的优先级:(从高到低)
1.Foreground process 前台进程 用户正在玩的应用程序对应的进程
2.Visible process 可视进程 用户仍然可以看到这个进程的界面。
3.Service process服务进程 应用程序有一个服务组件在后台运行。
4.Background process 后台进程 应用程序没有服务在运行 并且最小化 (activity onstop)
5.Empty process 空进程 没有任何运行的activity, 任务栈空了
长期后台运行的组件, 不要在activity开启子线程。
应该是创建服务,在服务里面开启子线程。
服务的目的:
1.长期后台运行。
2.提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,把进程重新创建。
下面看看服务怎么创建:
你会发现: Activity extends ContextThemeWrapper
Service extends ContextWrapper
Activity和Service都继承了同一个类,这样至少说明servicehe和Activity一样,都有生命周期。
Activity生命周期:oncreate ondestory onstart onstop onresume onpause
对于Service,oncreate和onDestroy【因为Service是在后台运行的组件,是没有界面可言的】
创建一个Activity,实现一个单击事件,打开Service
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View view) { Intent intent=new Intent(this,MyService.class); //创建一个意图 <strong>startService(intent); //这个地方需要startService(开启服务)</strong> } }
那么我们也需要有相关的服务绑定,触发的事件:
public class MyService extends Service{ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } //oncreate ondestory //服务没有界面 @Override public void <strong>onCreate()</strong> { System.out.println("服务创建了"); <strong>//程序每次运行的时候开启,每次关闭程序下次再次开启的时候触发</strong> super.onCreate(); } @Override public int <strong>onStartCommand</strong>(Intent intent, int flags, int startId) { <strong>//第一次运行程序的时候,开启触发一次。</strong> System.out.println("服务器收到了开启命令"); return super.onStartCommand(intent, flags, startId); } @Override public void <strong>onDestroy()</strong> { <strong> //取消服务的时候触发一次</strong> System.out.println("服务销毁了"); super.onDestroy(); } }
四大组件都需要在配置文件中配置的:
<service android:name="com.itheima.testservice.MyService"> </service>
运行程序的时候:程序运行后可以看到服务里面有了该服务。