旺仔练习:service的普通方式和绑定方式的启动和停止

package com.example.administrator.test.Fragment.Service;

import android.app.IntentService;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.example.administrator.test.R;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;

public class TestService extends AppCompatActivity {


    public void bt1_OnClick(View v) {

        Intent intent = new Intent( this, MyService.class );
        intent.putExtra( "test", "发送的数据" );
        startService( intent );
        Toast.makeText( this, "MyService已启动", Toast.LENGTH_SHORT ).show();
    }

    public void bt2_OnClick(View v) {

        Intent intent = new Intent( this, MyService.class );
        stopService( intent );
        Toast.makeText( this, "MyService已停止", Toast.LENGTH_SHORT ).show();
    }

    ServiceConnection sc;
    MyService.MyBinder myb;

    //绑定方式
    public void bt3_OnClick(View v) {
        Intent intent = new Intent( this, MyService.class );
        if (sc == null) sc = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                //接收代理对象
                myb = (MyService.MyBinder) iBinder;
                Toast.makeText( TestService.this, "绑定启动完成,接收返回的对象,读取到的数据="+myb.getTest(), Toast.LENGTH_SHORT ).show();
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                Toast.makeText( TestService.this, "服务连接断开", Toast.LENGTH_SHORT ).show();
            }
        };
        //三个参数:1.意图2.服务连接3.启动方式
        bindService( intent, sc, Context.BIND_AUTO_CREATE );//自动创建
    }
    //解除绑定
    public void bt4_OnClick(View v)
    {
        if (sc!=null)
        {
            unbindService( sc );
            sc=null;
        }else
        {
            Toast.makeText( this, "清先绑定服务", Toast.LENGTH_SHORT ).show();
        }
    }


}
package com.example.administrator.test.Fragment.Service;

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() {
        Log.e( "TAG","MyService被构造" );
    }

    @Override
    public void onCreate() {
        Log.e("TAG","onCreate被调用");
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        Log.e("TAG","onDestroy被调用");
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       String str= intent.getStringExtra( "test" );
        Log.e("TAG","onStartCommand被调用,并收到数据="+str);
        return super.onStartCommand( intent, flags, startId );
    }

    @Override
    public void onRebind(Intent intent) {
        Log.e("TAG","onRebind被调用");

        super.onRebind( intent );
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("TAG","onUnbind被调用");
        return super.onUnbind( intent );
    }

    //代理对象,自定义类
    public class MyBinder extends Binder
    {
        //定义数据交互的方法
        public int getTest()
        {
            return 123;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.e("TAG","onBind被调用");


        // TODO: Return the communication channel to the service.
        //throw new UnsupportedOperationException( "Not yet implemented" );
        return new MyBinder();
    }
}
<?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"
  >
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="普通方式启动"
        android:onClick="bt1_OnClick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="普通方式停止"
        android:onClick="bt2_OnClick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="绑定方式启动"
        android:onClick="bt3_OnClick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="解绑方式停止"
        android:onClick="bt4_OnClick"/>
</LinearLayout>
原文地址:https://www.cnblogs.com/jiang2538406936/p/5728614.html