android6.0 PowerManagerService dream分析(2)

2020-03-29 12:25

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的源码。


android6.0 PowerManagerService dream分析(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018年湖北省高考英语真题(含答案)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: