Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、 ContentProvider),它跟Activity的级别差不多,但不能页面显示只能后台运行,并且可以和其他组件进行交互。service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的,例如,一个service可能处理网络 事物,播放音乐,执行文件I/O,或与一个内容提供者交互,所有这些都在后台进行。
我们一定要知道的是这里Service的后台运行并不是子线程。Service的运行是在主线程中进行的,只是它没有界面显示而已,它的耗时操作同样需要开启子线程,否者会跟Activity一样出现ANR(application not response–程序没有响应)。
我们要知道的是主线程的内容包括UI和后台。只要程序中的UI或后台其中一个在跑,程序都算是在运行状态。
1.布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zking.g150831_android22.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动服务"
android:onClick="start"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服务"
android:onClick="stop"/>
</LinearLayout>
2.布局页面java代码public class MainActivity extends AppCompatActivity { private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intent = new Intent(this,MyServices.class);
} public void start(View view) { //传值给服务 intent.putExtra("text","哈哈呵呵");
//启动本地服务
startService(intent); } public void stop(View view) { //手动停止服务 stopService(intent); }}
3.注册本地服务public class MyServices extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("哈哈","onBind");
return null;
}
@Override
public void onCreate() {
Log.i("哈哈","onCreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//接收从activity传过来的值
String text=intent.getStringExtra("text");
Log.i("哈哈","onStartCommand"+text);
new MyThread(startId).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.i("哈哈","onDestroy");
super.onDestroy();
}
class MyThread extends Thread{
private int startId;
public MyThread(int startId){
this.startId=startId;
}
@Override
public void run() {
super.run();
for (int i = 0; i < 10; i++) {
Log.i("哈哈","i="+i);
SystemClock.sleep(1000);
}
//自动停止服务
//当第一个线程执行完毕,则会停止服务
// stopSelf();
//当有多个参数是就要带参数
stopSelf(startId);
}
}
}
4.清单文件配置在application下面加上
<!--exported,可以被其他组件启动-->
<service android:name=".MyServices"
android:exported="true">
</service>