遇到的例子:XX新闻
大致流程: 收到灭屏广播,起动HollowActivity, 周期设置alarm触发启动 HollowActivity(避免类似应用).
(亮屏finish HollowActivity, 避免被发现).
关键Log:
05-21 16:33:37.017929 18641 18641 I KeepAlive: onReceiveScreenBroadcast [android.intent.action.SCREEN_OFF]
05-21 16:33:37.220872 18641 18641 I KeepAlive: onShowOffScreenActivity
05-21 16:33:37.237014 13652 14439 I ActivityManager: START u0 {flg=0x10000000 cmp=com.tencent.news/.push.alive.offactivity.HollowActivity} from uid 10178
05-21 16:33:39.023445 18641 18641 I KeepAlive: onCheckState
05-21 16:33:39.026202 18641 18641 I KeepAlive: Check Push Process Importance [300], isFocus [false].
05-21 16:33:39.026496 18641 18641 I KeepAlive: onShowOffScreenActivity
05-21 16:33:39.033350 13652 14608 I ActivityManager: START u0 {flg=0x10000000 cmp=com.tencent.news/.push.alive.offactivity.HollowActivity} from uid 10178
但灭屏启动Activity,Android会pause该Activity
灭屏启动时触发Pause的log:
05-21 16:18:37.952 8746 10752 V ActivityManager: Sleep needs to pause ActivityRecord{494f8a7 u0 com.tencent.news/.push.alive.offactivity.HollowActivity t178}
灭屏启动的栈:
29560:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStack.goToSleepIfPossible(ActivityStack.java:1429)
29561:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStack.checkReadyForSleep(ActivityStack.java:1402)
29562:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStack.checkReadyForSleepDelayed(ActivityStack.java:1410)
29563:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2501)
29564:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2377)
29565:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStarter.resumeTargetStackIfNeeded(ActivityStarter.java:2485)
29566:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1703)
29567:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:1459)
29568:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:1060)
29569:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:695)
29570:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1358)
29571:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:527)
29572:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6166)
29573:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6120)
29574:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6111)
29575:05-21 16:33:39.056839 13652 14608 D ActivityManager: at android.app.IActivityManager
S
t
u
b
.
o
n
T
r
a
n
s
a
c
t
Stub.onTransact
Stub.onTransactstartActivity
(
I
A
c
t
i
v
i
t
y
M
a
n
a
g
e
r
.
j
a
v
a
:
10610
)
29576
:
05
−
2116
:
33
:
39.0568391365214608
D
A
c
t
i
v
i
t
y
M
a
n
a
g
e
r
:
a
t
a
n
d
r
o
i
d
.
a
p
p
.
I
A
c
t
i
v
i
t
y
M
a
n
a
g
e
r
(IActivityManager.java:10610) 29576:05-21 16:33:39.056839 13652 14608 D ActivityManager: at android.app.IActivityManager
(IActivityManager.java:10610)29576:05−2116:33:39.0568391365214608DActivityManager:atandroid.app.IActivityManagerStub.onTransact(IActivityManager.java:111)
29577:05-21 16:33:39.056839 13652 14608 D ActivityManager: at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4113)
29578:05-21 16:33:39.056839 13652 14608 D ActivityManager: at android.os.Binder.execTransact(Binder.java:846)
at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked
Google comment:
// When resuming the top activity, it may be necessary to pause the top activity (for
// example, returning to the lock screen. We suppress the normal pause logic in
// {@link #resumeTopActivityUncheckedLocked}, since the top activity is resumed at the
// end. We call the {@link ActivityStackSupervisor#checkReadyForSleepLocked} again here
// to ensure any necessary pause logic occurs. In the case where the Activity will be
// shown regardless of the lock screen, the call to
// {@link ActivityStackSupervisor#checkReadyForSleepLocked} is skipped.
final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
if (next == null || !next.canTurnScreenOn()) {
checkReadyForSleepDelayed();
}
这样的话,该应用在灭屏时为TOP_APP, process_state状态为TOP_SLEEPING,优先级较高,会避过一些Android规则。