今天主要学习一下Android四大组件的Service用法。
一、Service的启动与停止
1、定义一个服务MyService继承Service
package com.example.servicetest; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { return 0; } @Override public void onCreate() { super.onCreate(); Log.d("MyService", "---onCreate()-------"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("MyService", "---onStartCommand()-------"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d("MyService", "---onDestroy()-------"); }
}
复写其中onCreate()、onStartCommand()、onDestroy()方法
2、布局文件
<?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:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/start_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Start Service"/> <Button android:id="@+id/stop_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Stop Service"/> </LinearLayout>
3、主MainActivity
package com.example.servicetest; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startService = (Button) findViewById(R.id.start_service); Button stopService = (Button) findViewById(R.id.stop_service); startService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent startIntent = new Intent(MainActivity.this, MyService.class); startService(startIntent); } }); stopService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent stopIntent = new Intent(MainActivity.this, MyService.class); stopService(stopIntent); } }); } }
AndroidStudio 在AndroidManifest.xml中自动为Service注册
运行结果:
点击startService按钮
点击stopService按钮
二、活动与服务进行通信
希望在MyServcie中提供一个下载功能,然后在活动中可以决定何时开始下载,以及随时查看下载进度。
在MyService中修改
package com.example.servicetest; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; public class MyService extends Service { ...... private DownloadBinder mBinder = new DownloadBinder(); @Override public IBinder onBind(Intent intent) { return mBinder; } class DownloadBinder extends Binder{ public void startDownload(){ Log.d("MyService", "---startDownload() executed-------"); } public int getProgress(){ Log.d("MyService", "---getProgress() executed-------"); return 0; } } }
在布局文件中再增加两个button
<?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:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> ...... <Button android:id="@+id/bind_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Bind Service"/> <Button android:id="@+id/unbind_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Unbind Service"/> </LinearLayout>
在MainActivity中修改
public class MainActivity extends AppCompatActivity { private MyService.DownloadBinder downloadBinder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { downloadBinder = (MyService.DownloadBinder) service; downloadBinder.startDownload(); downloadBinder.getProgress(); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { ...... Button bindService = (Button) findViewById(R.id.bind_service); Button unbindService = (Button) findViewById(R.id.unbind_service); bindService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent bindIntent = new Intent(MainActivity.this, MyService.class); bindService(bindIntent, connection, BIND_AUTO_CREATE); //绑定服务 } }); unbindService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { unbindService(connection); //解绑服务 } }); } }
运行效果
点击bindService按钮
注意:当调用了startService()又调用了stopService()方法,必须同时调用stopService()和unbindServicce(),onDestry()方法才能执行