サービスをバインドして、サービスからUIを変更
package com.example.bindservice; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.widget.TextView; import com.example.bindservice.SampleService.LocalBinder; public class MainActivity extends Activity { private static final String TAB = "MainActivity"; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.textView1); } @Override public void onStart() { Log.i(TAB, "onStart"); super.onStart(); // Bind Intent intent = new Intent(getApplicationContext(), SampleService.class); bindService(intent, mySrviceConnection, Context.BIND_AUTO_CREATE);//サービスをバインド } @Override public void onStop() { Log.i(TAB, "onStop"); super.onStop(); // Unbind unbindService(mySrviceConnection);//サービスをアンバインド } private ServiceConnection mySrviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO 自動生成されたメソッド・スタブ LocalBinder binder = (SampleService.LocalBinder) service; binder.getService(tv); } @Override public void onServiceDisconnected(ComponentName name) { // TODO 自動生成されたメソッド・スタブ } }; }
package com.example.bindservice; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; import android.widget.TextView; public class SampleService extends Service { private static final String TAB = "SampleService"; private IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { SampleService getService(TextView tv) { Log.i(TAB, "LocalBinder");// tv.setText("サービスから変更"); return SampleService.this; } } @Override public IBinder onBind(Intent intent) { // TODO 自動生成されたメソッド・スタブ Log.i(TAB, "onBind");//起動時に呼ばれる return mBinder; } @Override public void onDestroy() { Log.i(TAB, "onDestroy"); } }
ボタンクリックでUIを変更してみる
package com.example.bindservice; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; 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; import android.widget.TextView; import com.example.bindservice.SampleService.LocalBinder; public class MainActivity extends Activity { private static final String TAB = "MainActivity"; private TextView tv; private LocalBinder binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.textView1); Button button = (Button) findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i(TAB, "ボタン2が押された"); if (binder != null){ Log.i(TAB, "binder は null で無い"); binder.getService(tv); }else{ Log.i(TAB, "binder は null"); } } }); } @Override public void onStart() { Log.i(TAB, "onStart"); super.onStart(); // Bind Intent intent = new Intent(getApplicationContext(), SampleService.class); bindService(intent, mySrviceConnection, Context.BIND_AUTO_CREATE);//サービスをバインド } @Override public void onStop() { Log.i(TAB, "onStop"); super.onStop(); // Unbind unbindService(mySrviceConnection);//サービスをアンバインド } private ServiceConnection mySrviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO 自動生成されたメソッド・スタブ binder = (SampleService.LocalBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { // TODO 自動生成されたメソッド・スタブ } }; }
package com.example.bindservice; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; import android.widget.TextView; public class SampleService extends Service { private static final String TAB = "SampleService"; private IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { void getService(TextView tv) { Log.i(TAB, "LocalBinder");// tv.setText("サービスから変更"); } } @Override public IBinder onBind(Intent intent) { // TODO 自動生成されたメソッド・スタブ Log.i(TAB, "onBind");//起動時に呼ばれる return mBinder; } @Override public void onDestroy() { Log.i(TAB, "onDestroy"); } }
サービスでスレッドを利用して定期的にUIを更新
package com.example.bindservice; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; 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; import android.widget.TextView; import com.example.bindservice.SampleService.LocalBinder; public class MainActivity extends Activity { private static final String TAB = "MainActivity"; private TextView tv; private LocalBinder binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.textView1); Button button = (Button) findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i(TAB, "ボタン2が押された"); if (binder != null){ Log.i(TAB, "binder は null ではない"); binder.getService(tv); }else{ Log.i(TAB, "binder は null"); } } }); } @Override public void onStart() { Log.i(TAB, "onStart"); super.onStart(); // Bind Intent intent = new Intent(getApplicationContext(), SampleService.class); bindService(intent, mySrviceConnection, Context.BIND_AUTO_CREATE);//サービスをバインド } @Override public void onStop() { Log.i(TAB, "onStop"); super.onStop(); // Unbind unbindService(mySrviceConnection);//サービスをアンバインド } private ServiceConnection mySrviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO 自動生成されたメソッド・スタブ binder = (SampleService.LocalBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { // TODO 自動生成されたメソッド・スタブ } }; }
package com.example.bindservice; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.widget.TextView; public class SampleService extends Service { private Handler handler; public class MyThread implements Runnable { private int data; @Override public void run() { // TODO 自動生成されたメソッド・スタブ while (true) { Log.i(TAB, "run::" + data);//二番目に呼ばれる data++; Message msg = handler.obtainMessage(); msg.arg1 = data; handler.sendMessage(msg); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } } } private static final String TAB = "SampleService"; private IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { void getService(final TextView tv) { Log.i(TAB, "LocalBinder");// //tv.setText("setData から変更");//ここでも変更可能 new Thread(new MyThread()).start(); /* //動くがメモリーリークの可能性がある //This Handler class should be static or leaks might occur handler = new Handler() { public void handleMessage(Message msg) { //updata.update(tv, data); Log.i(TAB, "handleMessage::" + msg); tv.setText(String.valueOf(msg.arg1));//ここでも変更可能 } }; */ handler = new MyHandler(tv); } } @Override public IBinder onBind(Intent intent) { // TODO 自動生成されたメソッド・スタブ Log.i(TAB, "onBind");//起動時に呼ばれる return mBinder; } @Override public void onDestroy() { Log.i(TAB, "onDestroy"); } public static class MyHandler extends Handler { private TextView tv; public MyHandler(TextView tv) { // TODO 自動生成されたコンストラクター・スタブ this.tv = tv; } @Override public void handleMessage(Message msg) { Log.i(TAB, "handleMessage::" + msg); tv.setText(String.valueOf(msg.arg1));//ここでも変更可能 } } }
サービスで変更された値をアクティビティに戻してUIを変更する。
package com.example.bindservice; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; 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; import android.widget.TextView; import com.example.bindservice.SampleService.LocalBinder; import com.example.bindservice.SampleService.UpdateData; public class MainActivity extends Activity { private static final String TAB = "MainActivity"; private TextView tv; private LocalBinder binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.textView1); Button button = (Button) findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i(TAB, "ボタン2が押された"); if (binder != null) { Log.i(TAB, "binder は null ではない"); binder.getService(new UpdateData() { @Override public void update(int data) { // TODO 自動生成されたメソッド・スタブ tv.setText(data + ""); } }); } else { Log.i(TAB, "binder は null"); } } }); } @Override public void onStart() { Log.i(TAB, "onStart"); super.onStart(); // Bind Intent intent = new Intent(getApplicationContext(), SampleService.class); bindService(intent, mySrviceConnection, Context.BIND_AUTO_CREATE);//サービスをバインド } @Override public void onStop() { Log.i(TAB, "onStop"); super.onStop(); // Unbind unbindService(mySrviceConnection);//サービスをアンバインド } private ServiceConnection mySrviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO 自動生成されたメソッド・スタブ binder = (SampleService.LocalBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { // TODO 自動生成されたメソッド・スタブ } }; }
package com.example.bindservice; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; public class SampleService extends Service { public interface UpdateData { public void update(int data); } private Handler handler; public class MyThread implements Runnable { private int data; @Override public void run() { // TODO 自動生成されたメソッド・スタブ while (true) { Log.i(TAB, "run::" + data);//二番目に呼ばれる data++; Message msg = handler.obtainMessage(); msg.arg1 = data; handler.sendMessage(msg); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } } } private static final String TAB = "SampleService"; private IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { void getService(UpdateData updata) { Log.i(TAB, "LocalBinder");// //tv.setText("setData から変更");//ここでも変更可能 new Thread(new MyThread()).start(); handler = new MyHandler(updata); } } @Override public IBinder onBind(Intent intent) { // TODO 自動生成されたメソッド・スタブ Log.i(TAB, "onBind");//起動時に呼ばれる return mBinder; } @Override public void onDestroy() { Log.i(TAB, "onDestroy"); } public static class MyHandler extends Handler { private UpdateData updata; public MyHandler(UpdateData updata) { // TODO 自動生成されたコンストラクター・スタブ //this.tv = tv; this.updata = updata; } @Override public void handleMessage(Message msg) { Log.i(TAB, "handleMessage::" + msg); //tv.setText(String.valueOf(msg.arg1));//ここでも変更可能 updata.update(msg.arg1); } } }
時間を表示してみる。
package com.example.bindservice; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; 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; import android.widget.TextView; import com.example.bindservice.SampleService.LocalBinder; import com.example.bindservice.SampleService.UpdateData; public class MainActivity extends Activity { private static final String TAB = "MainActivity"; private TextView tv; private LocalBinder binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.textView1); Button button = (Button) findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i(TAB, "ボタン2が押された"); if (binder != null) { Log.i(TAB, "binder は null ではない"); binder.getService(new UpdateData() { @Override public void update(String data) { // TODO 自動生成されたメソッド・スタブ tv.setText(data + ""); } }); } else { Log.i(TAB, "binder は null"); } } }); } @Override public void onStart() { Log.i(TAB, "onStart"); super.onStart(); // Bind Intent intent = new Intent(getApplicationContext(), SampleService.class); bindService(intent, mySrviceConnection, Context.BIND_AUTO_CREATE);//サービスをバインド } @Override public void onStop() { Log.i(TAB, "onStop"); super.onStop(); // Unbind unbindService(mySrviceConnection);//サービスをアンバインド } private ServiceConnection mySrviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO 自動生成されたメソッド・スタブ binder = (SampleService.LocalBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { // TODO 自動生成されたメソッド・スタブ } }; }
package com.example.bindservice; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; public class SampleService extends Service { public interface UpdateData { public void update(String data); } private static final String TAB = "SampleService"; private IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { void getService(UpdateData updata) { Log.i(TAB, "LocalBinder");// //tv.setText("setData から変更");//ここでも変更可能 //new Thread(new MyThread()).start(); MyHandler handler = new MyHandler(updata); handler.sendEmptyMessage(1); } } @Override public IBinder onBind(Intent intent) { // TODO 自動生成されたメソッド・スタブ Log.i(TAB, "onBind");//起動時に呼ばれる return mBinder; } @Override public void onDestroy() { Log.i(TAB, "onDestroy"); } public static class MyHandler extends Handler { private UpdateData updata; public MyHandler(UpdateData updata) { // TODO 自動生成されたコンストラクター・スタブ //this.tv = tv; this.updata = updata; } @Override public void handleMessage(Message msg) { Log.i(TAB, "handleMessage::" + msg); GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); String data = gc.get(Calendar.HOUR_OF_DAY) + ":" + gc.get(Calendar.MINUTE) + ":" + gc.get(Calendar.SECOND); sendEmptyMessageDelayed(1, 1000); updata.update(data); } } }
0 件のコメント:
コメントを投稿