1、SDK Service线程详解SDK Service线程详解作者:高焕堂试 阅:public TextView tv, tv2; private IBinder ib = null; private Handler h1, h2; public void onCreate(Bundle icicle) super.onCreate(icicle); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); btn = new Button(this); btn.setI
2、d(101); btn.setText(create threads); btn.setBackgroundResource(R.drawable.heart); btn.setOnClickListener(this); LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(120, 50); param.topMargin = 10; layout.addView(btn, param); btn2 = new Button(this); btn2.setId(102); btn2.setText(exit); bt
3、n2.setBackgroundResource(R.drawable.heart); btn2.setOnClickListener(this); layout.addView(btn2, param); tv = new TextView(this); tv.setTextColor(Color.WHITE); tv.setText(); LinearLayout.LayoutParams param2 = new LinearLayout.LayoutParams(FP, WC); param2.topMargin = 10; layout.addView(tv, param2); tv
4、2 = new TextView(this); tv2.setTextColor(Color.WHITE); tv2.setText(); layout.addView(tv2, param2); setContentView(layout); /- Intent in = new Intent(com.misoo.kx02c.REMOTE_SERVICE); in.putExtra(key, 0); bindService(in, mConnection, Context.BIND_AUTO_CREATE); private ServiceConnection mConnection = n
5、ew ServiceConnection() public void onServiceConnected(ComponentName className, IBinder ibinder) ib = ibinder; public void onServiceDisconnected(ComponentName className) ; public void onClick(View v) switch (v.getId() case 101: h1= new Handler() public void handleMessage(Message msg) tv.setText(Strin
6、g)msg.obj); ; Thread t1 = new Thread(new Task();正 文:l 由进程(Process)的主线程(Main thread)执行SDK-Service(如下图的myService)对象。 Android底层Binder System在binding-time会从该进程的Thread pool里启动一个线程来执行SDK-Service的Binder接口对象(如myBinder)。 执行myActivity对象的线程与myBinder对象的线程会同步(Synchronize),让myActivity开发者觉得IPC远程呼叫、跨进程的两个线程,就如同单一线程
7、一般。本文就Local SDK-Service与Remote SDK-Service两种来说明之。一、 如果属于Local Service。 - 则myActivity与myService两者都是由main thread所执行。亦即,两者是同一线程所执行。此情形下,两个类别里的函数都不宜太费时(例如不宜超过5秒钟);但必要时可诞生子线程去执行费时的函数。/ac01.java (myActivity)package com.misoo.kx02b;import android.app.Activity;import android.content.Intent;import android.gr
8、aphics.Color;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class ac01 extends Activity implements OnClickListener /private final int WC = LinearLayout.La
9、youtParams.WRAP_CONTENT; private TextView tx; private Button btn; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); LinearLayout.Layou
10、tParams param = new LinearLayout.LayoutParams(150, 40); param.topMargin = 5; tx = new TextView(this); tx.setTextSize(16); tx.setTextColor(Color.BLUE); tx.setBackgroundResource(R.drawable.x_yellow); layout.addView(tx, param); btn = new Button(this); btn.setText(Exit); btn.setBackgroundResource(R.draw
11、able.earth); btn.setOnClickListener(this); layout.addView(btn, param); this.setContentView(layout); /- String tna = Thread.currentThread().getName(); Thread.currentThread().setName(tna + -myActivity); /- myService.setUpdateListener(new UpdateUIListener(); Intent svc = new Intent(this, myService.clas
12、s); startService(svc); Override protected void onDestroy() super.onDestroy(); Intent svc = new Intent(this, myService.class); stopService(svc); class UpdateUIListener implements IListener public void update(String s) tx.setText(s); public void onClick(View v) this.finish(); IListener.javapackage com
13、.misoo.kx02b;public interface IListener public void update(String s);/myService.javapackage com.misoo.kx02b;import java.util.Timer;import java.util.TimerTask;import android.app.Service;import android.content.Intent;import android.os.Handler;import android.os.IBinder;import android.os.Message;public
14、class myService extends Service private static IListener plis; private static int k = 0; private Timer timer = new Timer(); private String tna; public Handler handler = new Handler() public void handleMessage(Message msg) plis.update(tna); ; Override public void onCreate() super.onCreate(); tna = Th
15、read.currentThread().getName(); TimerTask task = new TimerTask() Override public void run() handler.sendEmptyMessage(0); ; timer.schedule(task,1000, 4000); Override public IBinder onBind(Intent intent) return null; public static void setUpdateListener(IListener listener) plis = listener; 此程序输出:此结果说明
16、了,myActivity与myService两者都是由main thread所执行。二就一个SDK Service而言,都是由main thread执行myService的onCreate()、onBind()、onStart()等函数。 然而,是由独立的线程来执行myBinder:onTransact()函数。因为Binder System会从该进程的Thread pool里启动一个线程来执行SDK-Service的Binder接口对象(如myBinder)。二、 如果属于Remote Service。- 则myActivity与myService各在不同进程里执行,两者都是由各进程的mai
17、n thread所执行。亦即,两者是由不同的线程所执行。此情形下,两个类别里的函数也不宜太费时(例如不宜超过5秒钟);但必要时可诞生子线程去执行较费时的函数。- 所以由main thread(myService所在的进程的main thread)执行myService:onCreate()、myBinder:myBinder()和myService:onBind()。- 在Binding-time时,Binder System会建立myActivity与myBinder(即myService的Interface)之间的连结(Connection)。- 在IPC calling-time时,my
18、Activity的线程与myBinder的线程会同步(Synchronize),让myActivity开发者觉得IPC远程呼叫、跨进程的两个线程,就如同单一线程一般。-在送出IPC call时,执行myBinder对象的线程会执行myBinder:onTransact()函数。兹写个程序来说明之,此程序执行时,出现下述画面:按下上一个Button, 显示出main thread的执行路径:按下第二个Button, 显示出main thread执行onBind()函数:按下第三个Button, 显示出Binder System启用独立的thread执行onTransact()函数:兹列出程序代码
19、如下:/AndroidManifest.xml /ac01.javapackage com.misoo.kx02c;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.graphics.Color;import android.os.Bundle;import android.os.IB
20、inder;import android.os.Parcel;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class ac01 extends Activity implements OnClickListener private final int WC = LinearLayout.LayoutPara
21、ms.WRAP_CONTENT; private final int FP = LinearLayout.LayoutParams.FILL_PARENT; private Button btn, btn2, btn3, btn4; public TextView tv; private IBinder ib = null; public void onCreate(Bundle icicle) super.onCreate(icicle); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLa
22、yout.VERTICAL); btn = new Button(this); btn.setId(101); btn.setText(start service); btn.setBackgroundResource(R.drawable.heart); btn.setOnClickListener(this); LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(120, 50); param.topMargin = 10; layout.addView(btn, param); btn2 = new Button
23、(this); btn2.setId(102); btn2.setText(bind service); btn2.setBackgroundResource(R.drawable.heart); btn2.setOnClickListener(this); layout.addView(btn2, param); btn3 = new Button(this); btn3.setId(103); btn3.setText(IPC call); btn3.setBackgroundResource(R.drawable.heart); btn3.setOnClickListener(this)
24、; layout.addView(btn3, param); btn4 = new Button(this); btn4.setId(104); btn4.setText(exit); btn4.setBackgroundResource(R.drawable.heart); btn4.setOnClickListener(this); layout.addView(btn4, param); tv = new TextView(this); tv.setTextColor(Color.WHITE); tv.setText(); LinearLayout.LayoutParams param2
25、 = new LinearLayout.LayoutParams(FP, WC); param2.topMargin = 10; layout.addView(tv, param2); setContentView(layout); /- String tna = Thread.currentThread().getName(); Thread.currentThread().setName(tna + -ac01); /- private ServiceConnection mConnection = new ServiceConnection() public void onService
26、Connected(ComponentName className, IBinder ibinder) ib = ibinder; public void onServiceDisconnected(ComponentName className) ; public void onClick(View v) switch (v.getId() case 101: startService(new Intent(com.misoo.kx02c.REMOTE_SERVICE); break; case 102: bindService(new Intent(com.misoo.kx02c.REMOTE_SERVICE), mConnection, Context.BIND_AUTO_CREATE); break; case 103: Parcel pc = Parcel.obtain(); Parcel pc_reply = Parcel.obtain(); try ib.transact(1, pc, pc_reply, 0); tv.setText(pc_reply.readString()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1