一个程序android bind入门

一个程序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 );
                }
            }
        });
    }
}















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值