请问如何获取安卓正在前台运行的应用程序的包名

请问如何获取安卓正在前台运行的应用程序的包名,第1张

在framework中想添加这个功能,所以写了个appliction来实现一下获取正在运行的应用程序: 还是先看图吧: 这个app主要是简单的实现了获取非系统的应用程序和一些常用的系统应用程序,显示在一个listview中,并添加了点击(回复到你打开的界面)和长按事件(关闭应用程序)。 看看代码吧: 直接贴出来再加上注释吧(直接写在一个文件里): package andorid/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="40dip" android:layout_height="40dip" />  <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" >  <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" />  <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> main: <xml version="1/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/list_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" ></ListView> </LinearLayout> 在manifest文件中要加以个权限: <uses-permission android:name="androidpermissionRESTART_PACKAGES" /> 主要是前面的amkillBackgroundProcesses(packageName);方法要这个权限。

后台运行,就是你在运行某个软件的时候,来了短信或者电话,再或者你想去干别的事了,而直接切换到其他程序,那么之前运行的程序这个时候并没有关闭,而在后台运行。当你想让之前的程序再次出现到“前台”的时候,只需要去点击该程序的快捷方式就可以了,点进去你会发现程序还停留在你退出时的界面。

具体 *** 作的话,先运行某个游戏,开始了以后点HOME键,这个时候会显示桌面;然后你再点该游戏的快捷方式,就可以继续玩游戏了。这就是你说的后台和前台的切换。

市面上主流的APP都是在启动页做广告展示的,即通常都是叫SplashActivity的是APP的launcher页面,在manifest文件中配置, 2017年以来, 你会发现越来越多的APP在进入后台时隔一定时间后再次回到前台会再次显示广告界面, 3s自动播放, 或者手动点击跳过

比如网易云音乐, 淘宝, 京东商城啦, 似乎现在都是很主流的做法了,刚好最近项目中也有这样的需求, 我们也实现了一遍,所以写出来分享下,相互学习借鉴

要实现后台返回前台显示广告的逻辑, 主要的点在于监听APP进入后台的时间点, 和APP从后台返回到前台的时间点

我们是在Application子类中完成的, 定义三个常量记录当前APP状态

在Application中需要监听Activity的生命周期变化, registerActivityLifecycleCallbacks是application类已经提供好的一个方法, 它可以非常方便的监听整个项目中的所有activity的生命周期

可以很清晰的看到Activity的生命周期函数都会回调到ActivityLifecycleCallbacks接口来, 我们让Application实现此接口, 并在相应的回调方法中的完成具体的后台状态的监听

定义几个需要用的变量记录相关状态和时间

在onResume回调中监听回到前台的判断, 只要activity一旦获取焦点这个方法都会触发,并且会触发多次

在onStop回调中监听程序进入后台的判断

在onTrimMemory中监听应用程序的切换,这也是一种监听方式因为有时候onStop的回调不一定会完全执行(尤其是切换最近使用APP列表时),所以这个方法也是必须的

最后, 就可以得到当前APP的准确状态(sAppState)了, 是否可以再次显示广告

测试过程中,发现大部分品牌的手机都是OK的, 但是也有意外的,OPPO R9在切换应用时,一个回调都没触发,一定是Color OS改动太大, 目前尚无法处理OV手机适配起来就是费劲啊

最后补充一个判断程序是否前台的API

各位大佬们如果有更好的实现,欢迎提供思路!

1 把service和activity分开,让service开机启动。设置一个broadcast receiver接受开机信号,使用RECEIVE_BOOT_COMPLETED的permission, 然后启动service。activity启动后绑定到service上,通过ipc机制通信,acitivity结束后松绑。注意安装后要手动启动service,不会自动启动,之后重启手机后才会随开机启动。

2 在内存低的时候系统会自动清理进程,这时候后台service可能会被杀掉。可以在onStartCommand中返回START_STICKY,这样系统有足够多资源的时候,就会重新开启service。

3 以上不需要NDK,直接用SDK开发就可以了。

如果你的平台是面向Android30(API level

11),那么恭喜你,一个函数就可以搞定:

moveTaskToFront

>

要达到这个需求,可以设置activity的启动模式为singleTask或者singleInstance

activity一共有4中启动模式

standard

默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

例如:

若有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……

点back键会依照栈顺序依次退出。

singleTop

可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。

例如:

若有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。

若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)

若意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。

singleTask

只有一个实例。在同一个应用程序中启动的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。

如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

例如:

若应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2为singleTask模式,那么,无论在这个程序中如何点击启动,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多个实例,但是C2只会存在一个,并且这三个Activity都在同一个task里面。

但是C1->C2->C3->C2->C3->C1-C2,这样的 *** 作过程实际应该是如下这样的,因为singleTask会把task中在其之上的其它Activity destory掉。

*** 作:C1->C2 C1->C2->C3 C1->C2->C3->C2 C1->C2->C3->C2->C3->C1 C1->C2->C3->C2->C3->C1-C2

实际:C1->C2 C1->C2->C3 C1->C2 C1->C2->C3->C1 C1->C2

若是别的应用程序打开C2,则会新启一个task。

如别的应用Other中有一个activity,taskId为200,从它打开C2,则C2的taskIdI不会为200,例如C2的taskId为201,那么再从C2打开C1、C3,则C2、C3的taskId仍为201。

注意:如果此时点击home,然后再打开Other,发现这时显示的肯定会是Other应用中的内容,而不会是应用中的C1 C2 C3中的其中一个。

singleInstance

只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

例如:

程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。

若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若 *** 作步骤为other->D2->D1,这过程就涉及到了3个task了。

以上就是关于请问如何获取安卓正在前台运行的应用程序的包名全部的内容,包括:请问如何获取安卓正在前台运行的应用程序的包名、安卓2.3手机怎么让软件在后台运行后台运行后怎么再启动到“前台”、Android实现后台返回前台再次显示广告等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10139150.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存