Android Service

2017-10-25  本文已影响0人  百里漫步
  1. 本地服务(Local Service)
  1. 远程服务(Remote Service)

我们知道一个Activity是有生命周期的,并且必须在配置文档中进行注册。而Service和Activity是类似的,有类似的生命周期,也必须注册。
继承关系:
Service 继承 ContextWrapper,Activity 继承 ContextThemeWrapper,二者共同拥有一个“祖宗类”——Context。


如图所示是 Service 的两种生命周期(分别以startService和bindService启动)。
Start方式特点:


BindService: 支持数据回传。
什么时候使用Start?当服务不需要和启动源有任何关联的时候。这样有可能造成的结果:程序都退出了,但Service依然存在,为什么呢?因为二者没有关系。
不过,利用这种特性,也可以做一些特殊的应用,比如:UI不要了,但后台操作仍然继续的例子。但比较麻烦是就是:数据没办法回传了。
所以,既想让它们(服务和启动源)分离,又想得到回传数据,就需要将 Start 和 Bind 混合使用。


首先注册service
然后,
main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start:" />

    <Button
        android:id="@+id/start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doClick"
        android:text="StartService" />

    <Button
        android:id="@+id/stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doClick"
        android:text="StopService" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Bind:" />

    <Button
        android:id="@+id/bind"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doClick"
        android:text="BindService" />

    <Button
        android:id="@+id/play"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doClick"
        android:text="播放" />

    <Button
        android:id="@+id/pause"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doClick"
        android:text="暂停" />

    <Button
        android:id="@+id/next"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doClick"
        android:text="下一首" />

    <Button
        android:id="@+id/pervious"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doClick"
        android:text="上一首" />

    <Button
        android:id="@+id/unbind"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doClick"
        android:text="UnBindService" />

</LinearLayout>

MainActivity.java

import com.example.servicedemo.MyBindService.MyBinder;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {
    Intent intent1;
    Intent intent2;
    MyBindService service;
    ServiceConnection conn = new ServiceConnection() {
        
        @Override//当服务跟启动源断开的时候 会自动回调
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            
        }
        
        @Override//当服务跟启动源连接的时候 会自动回调
        public void onServiceConnected(ComponentName name, IBinder binder) {
            // TODO Auto-generated method stub
            service = ((MyBinder)binder).getService();
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void doClick(View v){
        switch (v.getId()) {
        case R.id.start:
             intent1 =  new Intent(MainActivity.this, MyStartService.class);
            startService(intent1);
            break;

        case R.id.stop:
            stopService(intent1);
            break;
        case R.id.play:
            service.Play();
            break;
        case R.id.pause:
            service.Pause();
            break;
        case R.id.pervious:
            service.Pervious();
            break;
        case R.id.next:
            service.next();
            break;
        case R.id.bind:
            intent2 = new Intent(MainActivity.this, MyBindService.class);
            startService(intent2);
            bindService(intent2, conn, Service.BIND_AUTO_CREATE);
            break;
        case R.id.unbind:
            unbindService(conn);
            break;
        }
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        stopService(intent2);
        unbindService(conn);
        super.onDestroy();
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

MyStartService.java

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyStartService extends Service {
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        Log.i("info", "Service--onCreate()");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        Log.i("info", "Service--onStartCommand()");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        Log.i("info", "Service--onDestroy()");
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        Log.i("info", "Service--onBind()");
        return null;
    }

}

MyBindService.java

import android.app.Service;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyBindService extends Service{
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        Log.i("info", "BindService--onCreate()");
        super.onCreate();
    }
    public class MyBinder extends Binder{
        public MyBindService getService(){
            return MyBindService.this;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        Log.i("info", "BindService--onBind()");
        return new MyBinder();
    }
    @Override
    public void unbindService(ServiceConnection conn) {
        // TODO Auto-generated method stub
        Log.i("info", "BindService--unbindService()");
        super.unbindService(conn);
    }
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        Log.i("info", "BindService--onDestroy()");
        super.onDestroy();
    }
    public void Play(){
        Log.i("info", "播放");
    }
    public void Pause(){
        Log.i("info", "暂停");
    }
    public void Pervious(){
        Log.i("info", "上一首");
    }
    public void next(){
        Log.i("info", "下一首");
    }
}

上一篇下一篇

猜你喜欢

热点阅读