到了新公司就是小白白,遇到设置好的闹钟提醒,在一键清理后不提醒, 一款手机是好的(6.0),一款有问题(5.1)看了模块代码是没问题的,应该是
framework的 service 中的 alarmManagerService 或者 systemui模块中 recent的问题,幸好有大神帮忙,以后会仔细看看这2个模块
- alarmManagerService 打日志,清理后 会收到
android.intent.action.packagerestarted 广播,在一个receviver中,看到有移除一些东西,另外一个中兴出来的同事也帮我看了(感谢死他了,我是真的什么都不会呀)
在移除中 (这个移除应该是 在清理那里清理成功后,他这边也会清理掉 相应的alarm)过滤了相应包名,试了下。可以唤醒,但是这样肯定不对呀。
2.recent模块
/android/frameworks/base/packages/SystemUI
com.android.systemui.recents 原生的
com.android.systemui.recent 另外的
RecentsActivity 只是对 清理buton做了隐藏显示处理
真正多点击清除事件在 RecentsView
在 RecentsView.java 中 点击事件 setOnClickListener 执行
dismissAllTasksAnimated (for 循环执行 stackView.dismissAllTasks() )
进入 TaskStackView.java中 dismissAllTasks()方法 会执行2个操作
1个是 Remove visible TaskViews
第2个 // Remove any other Tasks 第2个操作执行 mStack.removeTask(t); 方法
进入 TaskStack.java 中 /* Removes a task / removeTask() 方法中最后一句话 回调 // Notify that a task has been removed
mCb.onStackTaskRemoved(this, t, newFrontMostTask);
进入 TaskStackView.java 中 public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask) 这里是真正开始准备kill的地方
@Override
public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask) {
// Remove the view associated with this task, we can't rely on updateTransforms
// to work here because the task is no longer in the list
TaskView tv = getChildViewForTask(removedTask);
if (tv != null) {
mViewPool.returnViewToPool(tv);
}
// Notify the callback that we've removed the task and it can clean up after it
if (!removedTask.getIsLocked()) {
String packageName = removedTask.key.baseIntent.getComponent().getPackageName();
//Log.d("onStackTaskRemoved", "packageName = "+packageName);
if(packageName.equals("com.xx.xxx"))
{
String PAUSE_ACTION = "com.xx.xxx.pause";
Intent intent = new Intent(PAUSE_ACTION);
getContext().sendBroadcast(intent);
mRemovedTask = removedTask;
Message msg = mHandler.obtainMessage(FLIP_MSG);
mHandler.sendMessageDelayed(msg, mDelaytime);
mCb.onTaskViewDismissed(removedTask);
} else
{ //判断 mDontKillProgress 处理
if (mDontKillProgress.contains(packageName)) {
mCb.onTaskViewDismissed(removedTask);
} else {
//不然则全清
mCb.onTaskViewDismissed(removedTask);
mActivityManager.forceStopPackage(packageName);
}