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