Android底层结构-SDK Service线程知多少
- 格式:pdf
- 大小:711.93 KB
- 文档页数:27
按下上一个 Button, 显示出 main thread 的执行路径:
按下第二个 Button, 显示出 main thread 执行 nBind()函数:
按下第三个 Button, 显示出 Binder System 启用独立的 thread 执行 onTransact()函数:
兹列出程序代码如下:
} } class UpdateUIListener implements IListener { public void update(String s) { tx.setText(s); } } public void onClick(View v) { this.finish(); } } IListener.java package com.misoo.kx02b; public interface IListener { public void update(String s); } //myService.java package 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 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 = Thread.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) {
//AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="/apk/res/android" package="com.misoo.kx02c"> <application android:icon="@drawable/icon"> <activity android:name=".ac01" android:label="@string/app_name">
plis = listener; } } 此程序输出:
此结果说明了,myActivity 与 myService 两者都是由 main thread 所执行。
二. 就一个 SDK Service 而言, 都是由 main thread 执行 myService 的 onCreate()、 onBind()、 onStart()等函数。 然而,是由独立的线程来执行 myBinder::onTransact()函数。因为 Binder System 会从该进程的 Thread pool 里启动一个线程来执行 SDK-Service 的 Binder 接口对象(如 myBinder)。
//ac01.java (myActivity)
package com.misoo.kx02b; import android.app.Activity; import android.content.Intent; import android.graphics.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 = youtParams.WRAP_CONTENT; private TextView tx; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.main); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); youtParams param = new youtParams(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.drawable.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.class); startService(svc); } @Override protected void onDestroy() { super.onDestroy(); { Intent svc = new Intent(this, myService.class); stopService(svc);
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="UNCHER" />
</intent-filter> </activity> <activity android:name=".myActivity" android:process=":remote"> </activity> <service android:name=".myService" android:process=":remote"> <intent-filter> <action android:name="com.misoo.kx02c.REMOTE_SERVICE" /> </intent-filter> </service> </application> </manifest>
二、
如果属于 Remote Service。
---- 则 myActivity 与 myService 各在不同进程里执行, 两者都是由各 进程的 main 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 时,myActivity 的线程与 myBinder 的线程 会同步(Synchronize), 让 myActivity 开发者觉得 IPC 远程呼叫、跨进 程的两个线程,就如同单一线程一般。 ----在送出 IPC call 时,执行 myBinder 对象的线程会执行 myBinder::onTransact()函数。 兹写个程序来说明之,此程序执行时,出现下述画面: