android入门 — Service-LMLPHP

  Service完全在后台运行,没有用户界面。使用的时候先创建Service子类,然后在AndroidManifest.xml中进行注册,同时可以通过<intent-filter.../>进行限制启动的Intent。

  Service中重要的方法有:

  1.IBinder onBind(Intent intent):这是Service子类必须实现的方法,这个方法返回一个IBinder对象,应用程序可以通过该对象与Service对象进行通信;

  2.void onCreate():在Service第一次被创建的时候调用;

  3.void onDestroy():在Service被关闭之前调用;

  4.void onStartCommand(Intent intent, int flags, int startId):该方法在客户端调用startService(Intent)来启动Service的时候调用;

  5.boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接的时候调用这个方法。

第一种方式:使用Activity访问Service

  启动Service:startService(Intent intent)

  关闭Service:stopService(Intent intent)

第二种方式:绑定本地Service并与之通信

  如果Service和访问者之间需要进行方法调用和数据交换,则应该使用bindService()和unbindService()来启动和关闭Service。

  Context的bindService()方法

    bindService(Intent service, ServiceConnection conn, int flags)

  (1)service指定需要启动的Service

  (2)conn是一个ServiceConnection对象,这个对象用于监听访问者和Service之间的连接情况。当访问者与Service之间连接成功之后会回调ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)方法,当Service所在的宿主进程异常中断或其他原因停止的时候,会回调ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。

  (3)flags指定绑定的时候是否自动创建Service(如果Serivice没有创建)。这个参数可以指定为0,或者BIND_AUTO_CREATE(自动创建)。

      ServiceConnection对象的onServiceConnected()方法中有一个IBinder对象,这个对象可实现与被绑定的Service之间的通信。

  

Service有两种方式调用:

  1.start

  一旦某个组件start一个Service,Service开始独立运行,不再与原来的组件产生任何联系;

  2.bind

  一旦某个组件bind一个Service,Service会为组件提供一个接口,近似于客户端,会进行交互。

MyService.java

public class MyService extends Service
{
private static final String TAG = "MyService"; //只有在第一次的时候才会被调用
public void onCreate()
{
super.onCreate();
Log.i(TAG, "onCreate");
} //在销毁的时候才会被调用
@Override
public void onDestroy()
{
super.onDestroy();
Log.i(TAG, "onDestroy");
} //每次请求的时候都会被调用
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Log.i(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
} @Nullable
@Override
public IBinder onBind(Intent intent)
{
Log.i(TAG, "onBind");
return new MyBinder();
} class MyBinder extends Binder
{ }
}

  重写了一系列的方法,实现了输出功能。

public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
Button button_start;
Button button_stop;
Button button_bindservice;
Button button_unbindservice;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//连接失败
Log.i("Activity", "onServiceConnected");
} @Override
public void onServiceDisconnected(ComponentName name) {
//连接成功
Log.i("Activity", "onServiceDisconnected");
}
}; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建启动Service的Intent
final Intent intent = new Intent(this, MyService.class); init();
//设置监听事件
} public void init()
{
button_start = (Button)findViewById(R.id.StartService);
button_start.setOnClickListener(this);
button_stop = (Button)findViewById(R.id.StopService);
button_stop.setOnClickListener(this);
button_bindservice = (Button)findViewById(R.id.BindService);
button_bindservice.setOnClickListener(this);
button_unbindservice = (Button)findViewById(R.id.UnbindService);
button_unbindservice.setOnClickListener(this);
} public void onClick(View view)
{
Intent intent = new Intent(MainActivity.this, MyService.class);
switch (view.getId())
{
case R.id.StartService:
startService(intent);
break;
case R.id.StopService:
stopService(intent);
break;
case R.id.BindService:
bindService(intent, conn, BIND_AUTO_CREATE);
break;
case R.id.UnbindService:
//只需要关闭连接即可
unbindService(conn);
break;
}
}
}

  可以对各个按钮单独设置监听点击的事件,也可以直接统一进行操作。

android入门 — Service-LMLPHP

05-11 21:51