郑州网站做网站郑州网站推广策划

张小明 2026/1/9 14:37:49
郑州网站做网站,郑州网站推广策划,效果图制作软件免费,如何建立网页1.前言 在进行14.0的系统定制开发中#xff0c;在某些app的定制过程中#xff0c;需要知道某个app的启动时候然后获取 应用使用时长的功能#xff0c;所以就需要监听某个app的启动后就获取使用时长#xff0c;需要在Activity的生命周期中来实现监听功能 2.frameworks监听…1.前言在进行14.0的系统定制开发中在某些app的定制过程中需要知道某个app的启动时候然后获取 应用使用时长的功能所以就需要监听某个app的启动后就获取使用时长需要在Activity的生命周期中来实现监听功能2.frameworks监听某个app启动获取应用使用时长功能实现的核心类frameworks\base\core\java\android\app\Activity.java3.frameworks监听某个app启动获取应用使用时长功能实现的核心功能分析和实现Android Activity生命周期是Android开发中非常重要的概念它描述了一个Activity从创建到销毁的整个过程。Activity生命周期由一系列回调方法组成开发者可以在这些方法中执行相应的操作。1. Activity生命周期的状态Activity在其生命周期中会经历以下几种状态运行RunningActivity位于屏幕前台用户可以与它交互。暂停PausedActivity部分被遮挡不再处于前台但仍然可见例如有一个透明或非全屏的Activity覆盖在上面。此时Activity不再接收用户输入。停止StoppedActivity完全被遮挡不可见。它仍然保留所有状态和成员信息但可能被系统销毁。销毁DestroyedActivity被系统销毁或从内存中移除。2. 生命周期回调方法Activity类提供了以下核心生命周期方法onCreate()调用时机Activity首次创建时调用。作用进行一次性初始化如加载布局、绑定数据等。后续状态onStart()onStart()调用时机Activity即将变为可见时调用进入前台。作用准备Activity进入前台但尚未与用户交互。后续状态onResume()如果Activity进入前台或onStop()如果Activity被隐藏onResume()调用时机Activity开始与用户交互之前调用。此时Activity位于Activity栈的顶部。作用启动动画、初始化相机等需要与用户交互的组件。后续状态onPause()onPause()调用时机当Activity即将进入暂停状态时调用例如有另一个非全屏Activity覆盖。作用提交未保存的更改、释放系统资源、停止动画等。注意此方法应快速执行否则会影响新Activity的显示。后续状态onResume()如果Activity重新回到前台或onStop()如果Activity完全不可见onStop()调用时机Activity完全不可见时调用。作用释放不再需要的资源保存数据。后续状态onRestart()如果Activity重新显示或onDestroy()如果Activity被销毁onRestart()调用时机Activity从停止状态重新显示时调用在onStart()之前。作用重新初始化在onStop()中释放的资源。后续状态onStart()onDestroy()调用时机Activity被销毁之前调用。这可能是因为Activity结束调用finish()或系统为节省空间而临时销毁该Activity。作用释放所有资源包括线程、数据库连接等。3. 生命周期图示为了更好地理解以下是一个经典的生命周期图示描述性启动ActivityonCreate() - onStart() - onResume()另一个Activity覆盖当前Activity非全屏onPause() - 如果完全覆盖onStop()返回原ActivityonRestart() - onStart() - onResume()回退或结束当前ActivityonPause() - onStop() - onDestroy()注意当系统资源不足时可能会杀死后台的Activity。此时当用户返回时Activity会重新创建。4. 保存和恢复状态由于Activity可能被系统销毁因此需要保存状态以便恢复。onSaveInstanceState()在Activity可能被销毁之前调用例如屏幕旋转、系统资源回收。可以将临时数据保存到Bundle中。onRestoreInstanceState()在onStart()之后、onResume()之前调用用于恢复保存的状态。也可以选择在onCreate()中恢复。5. 实际开发中的注意事项避免在onPause()和onStop()中执行耗时操作否则会影响新Activity的响应。在onResume()中重新获取资源如相机在onPause()中释放。使用onSaveInstanceState()保存临时UI状态使用onCreate()或onRestoreInstanceState()恢复。了解配置变更如屏幕旋转会销毁并重建Activity因此需要妥善处理状态保存。3.1 Activity.java中相关源码分析 ‌Activity在‌Android应用程序中扮演着核心角色主要负责展示用户界面、处理用户输入、管理生命周期以及与其他组件进行交互。 展示用户界面 Activity是用户可以看到的一个屏幕它负责显示应用程序的用户界面包括布局、按钮、文本框等元素。 用户可以通过与这些界面的交互来完成各种操作。MainThread CallSuper protected void onCreate(Nullable Bundle savedInstanceState) { if (DEBUG_LIFECYCLE) Slog.v(TAG, onCreate this : savedInstanceState); if (mLastNonConfigurationInstances ! null) { mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders); } if (mActivityInfo.parentActivityName ! null) { if (mActionBar null) { mEnableDefaultActionBarUp true; } else { mActionBar.setDefaultDisplayHomeAsUpEnabled(true); } } .... mRestoredFromBundle savedInstanceState ! null; mCalled true; } public void onCreate(Nullable Bundle savedInstanceState, Nullable PersistableBundle persistentState) { onCreate(savedInstanceState); } CallSuper protected void onResume() { if (DEBUG_LIFECYCLE) Slog.v(TAG, onResume this); dispatchActivityResumed(); mActivityTransitionState.onResume(this); enableAutofillCompatibilityIfNeeded(); if (mAutoFillResetNeeded) { if (!mAutoFillIgnoreFirstResumePause) { View focus getCurrentFocus(); if (focus ! null focus.canNotifyAutofillEnterExitEvent()) { // TODO(b/148815880): Bring up keyboard if resumed from inline authentication. // TODO: in Activity killed/recreated case, i.e. SessionLifecycleTest# // testDatasetVisibleWhileAutofilledAppIsLifecycled: the Views initial // window visibility after recreation is INVISIBLE in onResume() and next frame // ViewRootImpl.performTraversals() changes window visibility to VISIBLE. // So we cannot call View.notifyEnterOrExited() which will do nothing // when View.isVisibleToUser() is false. getAutofillManager().notifyViewEntered(focus); } } } notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_RESUME); mCalled true; } //add core start public boolean isAppRunningState(Nullable String appPackageName){ ActivityManager activities (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); ListActivityManager.RunningAppProcessInfo appProcesses activities.getRunningAppProcesses(); if (appProcesses null) { return false; } for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { Log.e(Activity_Main,appProcess.processName appProcess.processName); if (appProcess.processName.equals(appPackageName)) { return true; } } return false; } private String getappusedtimes(Nullable String appPackageName){ String usedtimes ; UsageStatsManager usageStatsManager (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); try { Calendar calendar Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); ListUsageStats stats usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, calendar.getTimeInMillis(), System.currentTimeMillis()); for(int i0;istats.size();i){ final android.app.usage.UsageStats pkgStats stats.get(i); String package_namepkgStats.getPackageName(); long time_begin pkgStats.getFirstTimeStamp(); long time_endpkgStats.getLastTimeStamp(); long time_usedpkgStats.getLastTimeUsed(); long time_totalspkgStats.getTotalTimeInForeground(); if(time_total0package_name.equals(appPackageName)) { Log.e(AppInfoDashboardFragment,package_name:package_name--time_begin:time_begin--time_used:time_used--time_total:time_total); return time_totals/1000s; } } } catch (Exception e) { e.printStackTrace(); } return usedtimes; } //add core end CallSuper protected void onPostResume() { //add core start boolean isRunning isAppRunningState(com.tel.troops); android.util.Log.e(Activity_Main,com.tel.troops is runisRunning); if(isRunning){ String run_time getappusedtimes(com.tel.troops); android.util.Log.e(Activity_Main,com.tel.troops is run_time run_time); } //add core end final Window win getWindow(); if (win ! null) win.makeActive(); if (mActionBar ! null) mActionBar.setShowHideAnimationEnabled(true); mCalled true; }在上述的Activity.java的相关源码中在onCreate(Nullable Bundle savedInstanceState) 中 的相关源码中主要是初始化布局等功能而在onPostResume()表示页面已经加载完毕后 调用的相关方法所以就可以在onPostResume()中来调用 isAppRunningState(com.tel.troops) 来利用ActivityManager.RunningAppProcessInfo当前置顶运行的进行是否是需要监听的app包名 如果返回true就可以监听到app已经启动了,这时候就可以调用getappusedtimes(com.tel.troops); 来获取需要监听app的运行时间了这样就可以监听app启动的时候来获取这个app的运行时间了 从而来实现了相关的功能
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

关于公司网站建设的请示深圳优化公司样高粱seo

计算机毕业设计球鞋产品抢购系统j8kcu9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。当“发售价”遇上“秒空”,传统电商的下单流程就像慢动作回放:库存…

张小明 2026/1/9 7:20:17 网站建设

重庆网站建设模板服务海外建站服务平台

还在为漫画翻译中的繁琐流程而头疼吗?LabelPlus作为一款专业的漫画翻译工具,正在彻底改变传统的工作模式。本文将带你从安装到精通,全面掌握这款效率神器的使用技巧。 【免费下载链接】LabelPlus Easy tool for comic translation. 项目地址…

张小明 2026/1/6 5:09:43 网站建设

长春建站怎么做雄县做网站的

第一章:农业种植Agent的灌溉策略在智能农业系统中,种植Agent通过环境感知与决策模型实现自动化灌溉。该Agent依据土壤湿度、气象数据和作物生长阶段动态调整灌溉策略,以优化水资源利用并提升产量。环境数据采集 种植Agent依赖多类传感器实时采…

张小明 2026/1/7 13:54:04 网站建设

个人站长网站需要注册公司吗个人理财的网站开发

SQL Server资源管理、连接与数据库管理全解析 1. 资源管理器(Resource Governor) 资源管理器可帮助服务器将资源限制映射到特定工作负载组和资源池的登录中。你可以在 此处 了解更多关于分类器函数的信息。 同事Travis Wright在GitHub上创建了一个简单易用的演示,展示了…

张小明 2026/1/7 1:30:33 网站建设

医院网站站群建设优化公司

网络模拟与科学计算工具的使用指南 在网络和科学计算领域,有许多强大的工具可以帮助我们进行实验和开发。本文将介绍网络模拟器 NS - 2、科学计算软件 Scilab 以及 Bash 脚本编程的相关知识。 1. 网络模拟器 NS - 2 NS - 2 是一款支持图形表示和多种协议的工具,它能帮助我…

张小明 2026/1/9 7:39:57 网站建设

适合seo优化的网站响应式网站用什么单位

数字员工通过AI销冠系统正在重新定义企业的运营模式。它不仅能够迅速处理大量客户沟通,还能显著降低人力成本。利用智能技术,数字员工可以全天候无缝服务,提升客户体验。例如,在进行客户满意度回访时,AI销冠系统能够对…

张小明 2026/1/8 2:27:02 网站建设