be explicit.
mContext.sendBroadcastAsUser(mCloseNotificationShadeIntent, UserHandle.ALL);
mCurrentDream = new DreamRecord(token, name, isTest, canDoze, userId);
mDreamStartTime = SystemClock.elapsedRealtime(); MetricsLogger.visible(mContext, mCurrentDream.mCanDoze ? MetricsLogger.DOZING : MetricsLogger.DREAMING);
try {
mIWindowManager.addWindowToken(token, WindowManager.LayoutParams.TYPE_DREAM); } catch (RemoteException ex) {
Slog.e(TAG, \ stopDream(true /*immediate*/); return; }
Intent intent = new Intent(DreamService.SERVICE_INTERFACE); intent.setComponent(name);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); try {
if (!mContext.bindServiceAsUser(intent, mCurrentDream,//开启Service Context.BIND_AUTO_CREATE Context.BIND_FOREGROUND_SERVICE,
new UserHandle(userId))) {
Slog.e(TAG, \ stopDream(true /*immediate*/); return; }
} catch (SecurityException ex) {
Slog.e(TAG, \ stopDream(true /*immediate*/); return; }
mCurrentDream.mBound = true;
mHandler.postDelayed(mStopUnconnectedDreamRunnable, DREAM_CONNECTION_TIMEOUT);//出错处理 } finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER); } }
| 然后bindService了DreamService,我们来看这个Service的onBind接口。 [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 public final IBinder onBind(Intent intent) {
if (mDebug) Slog.v(TAG, \ return new DreamServiceWrapper(); }
DreamServiceWrapper 如下,就是binder接口。用来binder通信 [cpp] view plain copy 在CODE上查看代码片派生到我的代码片
private final class DreamServiceWrapper extends IDreamService.Stub { @Override
public void attach(final IBinder windowToken, final boolean canDoze) { mHandler.post(new Runnable() { @Override
public void run() {
DreamService.this.attach(windowToken, canDoze); } }); }
@Override
public void detach() {
mHandler.post(new Runnable() { @Override
public void run() {
DreamService.this.detach(); } }); }
@Override
public void wakeUp() {
mHandler.post(new Runnable() { @Override
public void run() {
DreamService.this.wakeUp(true /*fromSystem*/); } }); } }
我们再来看DreamRecord ,就是在DreamController调用bindService时候作为ServiceConnection
[cpp] view plwww.tt951.comain copy 在CODE上查看代码片派生到我的代码片 private final class DreamRecord implements DeathRecipient, ServiceConnection { ......
// May be called on any thread. @Override
public void onServiceConnected(ComponentName name, final IBinder service) { mHandler.post(new Runnable() { @Override
public void run() {
mConnected = true;
if (mCurrentDream == DreamRecord.this && mService == null) { attach(IDreamService.Stub.asInterface(service)); } } }); }
我们再来看attach这个函数,远程调用了Service的attach函数,把Service的binder保存在了mCurrentDream的mService中,这样就能和DreamService通信了 [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 private void attach(IDreamService service) { try {
service.asBinder().linkToDeath(mCurrentDream, 0);
service.attach(mCurrentDream.mToken, mCurrentDream.mCanDoze); } catch (RemoteException enc630.comx) {
Slog.e(TAG, \ stopDream(true /*immediate*/); return; }
mCurrentDream.mService = service;
if (!mCurrentDream.mIsTest) {
mContext.sendBroadcastAsUser(mDreamingStartedIntent, UserHandle.ALL); mCurrentDream.mSentStartBroadcast = true; } }
三、总结
主要讲了PowerManagerService中没有支持dream,但是我们也简单介绍了DreamService的源码。