您的位置:首页 > 移动开发 > Android开发

一个程序android bind入门

2017-01-17 12:06 176 查看
一个程序android bind入门

main.xml

<?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"

    tools:context="com.example.asus.myapplication.MainActivity"

    android:orientation="vertical">

    <TextView

        android:id="@+id/text34"

        android:textSize="24dp"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Hello 123!" />

    <Button

        android:text="start"

        android:textSize="40dp"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginTop="10dp"

        android:id="@+id/startbutton_id" />

    <Button

        android:text="stop"

        android:textSize="40dp"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginTop="10dp"

        android:id="@+id/stopbutton_id" />

    <Button

        android:text="bind"

        android:textSize="40dp"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginTop="10dp"

        android:id="@+id/bindbutton_id" />

    <Button

        android:text="unbind"

        android:textSize="40dp"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginTop="10dp"

        android:id="@+id/unbindbutton_id" />

</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.asus.myapplication">

    <uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />

    <uses-permission android:name="android.permission.REBOOT" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />

    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <uses-permission android:name="android.permission.DEVICE_POWER" />

    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

    <!-- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

    <uses-permission android:name="android.permission.DEVICE_POWER" />

    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

    <uses-permission android:name="android.permission.VIBRATE" />

    <uses-permission android:name="android.permission.BLUETOOTH" />

    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />

    <uses-permission android:name="android.permission.NFC" />

    <uses-permission android:name="android.permission.HARDWARE_TEST" />

    <uses-permission android:name="android.permission.CALL_PHONE" />

    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    <uses-permission android:name="android.permission.MASTER_CLEAR" />

    <uses-permission android:name="android.permission.USE_CREDENTIALS" />

    <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />

    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />

    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <uses-permission android:name="android.permission.WRITE_CONTACTS" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <uses-permission android:name="android.permission.ACCESS_WIMAX_STATE" />

    <uses-permission android:name="android.permission.CHANGE_WIMAX_STATE" />

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <uses-permission android:name="com.android.certinstaller.INSTALL_AS_USER" />

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />

    <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" />

    <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />

    <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />

    <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />

    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />

    <uses-permission android:name="android.permission.BATTERY_STATS" />

    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />

    <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />

    <uses-permission android:name="android.permission.MOVE_PACKAGE" />

    <uses-permission android:name="android.permission.USE_CREDENTIALS" />

    <uses-permission android:name="android.permission.BACKUP" />

    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />

    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />

    <uses-permission android:name="android.permission.READ_SYNC_STATS" />

    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />

    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />

    <uses-permission android:name="android.permission.STATUS_BAR" />

    <uses-permission android:name="android.permission.MANAGE_USB" />

    <uses-permission android:name="android.permission.SET_POINTER_SPEED" />

    <uses-permission android:name="android.permission.SET_KEYBOARD_LAYOUT" />

    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

    <uses-permission android:name="android.permission.COPY_PROTECTED_DATA" />

    <uses-permission android:name="android.permission.MANAGE_USERS" />

    <uses-permission android:name="android.permission.READ_PROFILE" />

    <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />

    <uses-permission android:name="android.permission.SET_TIME" />

    <uses-permission android:name="android.permission.ACCESS_NOTIFICATIONS" />

    <uses-permission android:name="android.permission.REBOOT" />

    <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />

    <application

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="@string/app_name"

        android:supportsRtl="true"

        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"

            android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <service

            android:name=".MyService"

            android:enabled="true"

            android:exported="true">

            <intent-filter>

                <action android:name="com.test.SERVICE_TEST" />

                <category android:name="android.intent.category.default" />

            </intent-filter>

        </service>

    </application>

</manifest>

MyService.java

package com.example.asus.myapplication;

//package com.test.service;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

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) {

        // TODO: Return the communication channel to the service.

        throw new UnsupportedOperationException("Not yet implemented");

    }

}

*/

public class MyService extends Service {

    private final String TAG = "MyService";

    private final IBinder mBinder = new LocalBinder();

    public class LocalBinder extends Binder {

        String stringToSend = "I'm the test String";

        MyService getService() {

            Log.i( TAG, "getService ---> " + MyService.this);

            return MyService.this;

        }

    }

    @Override

    public IBinder onBind(Intent intent) {

        //TODO Auto-generated method stub

        Log.i( TAG, "onBind" );

        //IBinder myIBinder = null;

        //if ( null == myIBinder )

        // myIBinder = new LocalBinder() ;

        // return myIBinder;

        return mBinder;

        //也可以像上面几个语句那样重新new一个IBinder

        //如果这边不返回一个IBinder的接口实例,那么ServiceConnection中的onServiceConnected就不会被调用

        //那么bind所具有的传递数据的功能也就体现不出来

        //这个返回值是被作为onServiceConnected中的第二个参数的

    }

    @Override

    public void onCreate() {

        //TODO Auto-generated method stub

        super.onCreate();

        Log.i( TAG, "onCreate" );

    }

    @Override

    public void onDestroy() {

        //TODO Auto-generated method stub

        super.onDestroy();

        Log.i( TAG, "onDestroy" );

    }

    /*

    @Override

    public void onStart(Intent intent, int startId) {

        //TODO Auto-generated method stub

        super.onStart(intent, startId);

        Log.i( TAG, "onStart" );

    }

    */

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {

        //TODO Auto-generated method stub

        Log.i( TAG, "onStartCommand" );

        return super.onStartCommand(intent, flags, startId);

    }

    @Override

    public boolean onUnbind(Intent intent) {

        //TODO Auto-generated method stub

        Log.i( TAG, "onUnbind" );

        return super.onUnbind(intent);

    }

}

MainActivity.java

package com.example.asus.myapplication;

//package com.test.service;

import android.app.Activity;

//import android.support.v7.app.AppCompatActivity;

import android.content.Context;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.os.Build;

import android.os.Bundle;

import android.provider.Settings;

import android.util.Log;

import android.widget.TextView;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.HashMap;

import java.util.Map;

import android.content.Context;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.os.Build;

import android.os.Environment;

import android.os.Looper;

import android.util.Log;

import android.widget.Toast;

import java.io.File;

import java.io.FileOutputStream;

import java.io.PrintWriter;

import java.io.StringWriter;

import java.io.Writer;

import java.lang.reflect.Field;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

import java.lang.Thread.UncaughtExceptionHandler;

import android.content.Context;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.content.pm.PackageManager.NameNotFoundException;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.preference.PreferenceActivity;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.media.MediaPlayer;

import android.os.Bundle;

import android.os.IBinder;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity {

    private final String TAG = "MainActivity";

    private Button startButton, bindButton;

    private Button stopButton, unbindButton;

    private ServiceConnection sc;

    private MediaPlayer mediaPlayer = null;

    private MyService myService;// 类似于MediaPlayer mPlayer = new

    //MediaPlayer();只不过这边的服务是自定义的,不是系统提供好了的

    //Called when the activity is first created.

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        startButton = (Button) findViewById(R.id.startbutton_id);

        stopButton = (Button) findViewById(R.id.stopbutton_id);

        bindButton = (Button) findViewById(R.id.bindbutton_id);

        unbindButton = (Button) findViewById(R.id.unbindbutton_id);

        sc = new ServiceConnection() {

            //只有在MyService中的onBind方法中返回一个IBinder实例才会在Bind的时候

            // 调用onServiceConnection回调方法

            // 第二个参数service就是MyService中onBind方法return的那个IBinder实例,可以利用这个来传递数据

            @Override

            public void onServiceConnected(ComponentName name, IBinder service) {

                //TODO Auto-generated method stub

                myService = ((MyService.LocalBinder) service).getService();

                String recStr = ((MyService.LocalBinder) service).stringToSend;

                //利用IBinder对象传递过来的字符串数据(其他数据也可以啦,哪怕是一个对象也OK)

                Log.i( TAG,"The String is : " + recStr);

                Log.i( TAG, "onServiceConnected : myService ---> " + myService);

            }

            @Override

            public void onServiceDisconnected(ComponentName name) {

                //SDK上是这么说的:

                //This is called when the connection with the service has been unexpectedly disconnected

                //that is, its process crashed. Because it is running in our same process, we should never see this happen.

                //所以说,只有在service因异常而断开连接的时候,这个方法才会用到

                //TODO Auto-generated method stub

                sc = null;

                Log.i( TAG, "onServiceDisconnected : ServiceConnection --->" + sc);

            }

        };

        startButton.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                //TODO Auto-generated method stub

                Intent intent = new Intent( MainActivity.this, MyService.class );

                startService(intent);

                Log.i( TAG, "Start button clicked" );

            }

        });

        stopButton.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                //Intent intent = new

                //Intent(LocalServiceTestActivity.this,MyService.class);

                //stopService(intent); 这种方法也是可以的哈

                Intent intent = new Intent();

                intent.setAction("com.test.SERVICE_TEST");

                stopService(intent);

                Log.i( TAG, "Stop Button clicked" );

            }

        });

        bindButton.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                //Intent intent = new Intent(LocalServiceTestActivity.this, MyService.class);

                //这样也可以的

                Intent intent = new Intent();

                intent.setAction("com.test.SERVICE_TEST");

                bindService(intent, sc, Context.BIND_AUTO_CREATE);

                //bind多次也只会调用一次onBind方法

                Log.i( TAG, "Bind button clicked" );

            }

        });

        unbindButton.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                try {

                    unbindService(sc);

                    //这边如果重复unBind会报错,提示该服务没有注册的错误——IllegalArgumentException:

                    //Service not registered: null

                    //所以一般会设置一个flag去看这个service

                    //bind后有没有被unBind过,没有unBind过才能调用unBind方法

                    Log.i(TAG, "Unbind Button clicked");

                }catch (IllegalArgumentException e){

                    Log.i( TAG, "Unbind Button clicked" + e );

                }

            }

        });

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: