我在有根设备上创建了一个系统应用程序,并想知道:有没有办法ActivityManagerService从该应用程序访问方法?
我试过使用该ActivityManager对象,但并非所有方法都存在于ActivityManagerService.
谢谢!
假设一个应用程序进程由 zygote 启动,PID 为 1234。当应用程序启动时,PID:1234 分叉另一个进程,例如 PID:1300。当我退出应用程序时,PID:1234 被信号 9 (SIGKILL )。PID: 1300 随后成为孤儿进程并被 init 进程 (PID: 1) 采用。很快,libprocessgroup 也会触发并杀死 PID:1300(作为 PID:1234 的进程组的一部分)。这是如何触发的?换句话说,libprocessgroup 何时突然介入以清理剩余进程?
由于某些要求,我的启动器活动的 launchMode 属性设置为 singleTask。
<activity
android:name=".map.MapsActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/MapScreenTheme"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,如果我打开另一个活动 -> 按主页 -> 单击启动器应用程序中的应用程序图标 -> 它会打开 MapActivity 而不是之前打开的活动。
但是,如果我通过最近菜单导航到该应用程序,则不会发生这种情况。然后新打开的活动保持在顶部。
有人可以解释一下这里发生的关于 backstack 的事情,为什么 ActivityManagerService 没有考虑到应用程序进程已经存在,但决定启动启动器应用程序并清除 backstack 而不是简单地将应用程序向前推进?
可以在此处创建的一个小示例应用程序中观察到此问题 - https://github.com/abhiank/SingleTaskActivity
我正在开发一个应用程序,我希望获得所有非系统应用程序的列表.这是我的代码部分:
TextView tv = new TextView(this);
this.setContentView(tv);
ActivityManager actvityManager = (ActivityManager)
this.getSystemService( ACTIVITY_SERVICE );
PackageManager pm = this.getPackageManager();
List<PackageInfo> list =pm.getInstalledPackages(0);
for(int i=0;i<list.size();i++)
{
System.out.println("list"+i+" "+list.get(i));
}
for(PackageInfo pi : list)
{
try
{
ApplicationInfo ai=pm.getApplicationInfo(pi.packageName, 0);
if (ai.sourceDir.startsWith("/data/app/"))
{
tv.setText(ai.className);// non system apps
}
else
{
System.out.println("system apps");// system apps
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
但它显示,所有的应用程序作为系统应用程序
在MainActivity我想知道当前Activity在 App 内打开的 Top 。
对于前棒棒糖,我使用了以下内容
ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
Run Code Online (Sandbox Code Playgroud)
在我发现的其他帖子中,我应该使用:
getAppTasks() and gettaskinfo
Run Code Online (Sandbox Code Playgroud)
但是我找不到任何完整的示例来演示如何使用上述内容。任何帮助都是感激的。问候。
编辑:当前代码:
if (Build.VERSION.SDK_INT >= 23) {
cn = am.getAppTasks().get(0).getTaskInfo().topActivity;
}else{
cn = am.getRunningTasks(1).get(0).topActivity;
}
Run Code Online (Sandbox Code Playgroud)
am.getRunningTasks 在 API 21 中已弃用。 am.getAppTasks#topActivity 在 API 23 中可用。所以更新的问题是如何为 API 21 和 22 处理它。
是否可以在 Android 上检测另一个应用程序是否正在运行?当地图应用程序(如 Waze 或 Google 地图)运行时,我需要在我的应用程序中触发某些操作。
我想isLowRamDevice为我的应用程序使用帮助方法,它可以流式传输视频.当我支持设备关闭API级别15时,我不得不使用ActivityManagerCompat.isLowRamDevice().我真的很困惑,它总是返回假,即使我使用非常旧的设备.然后我检查了方法本身并看到了这个:
public static boolean isLowRamDevice(@NonNull ActivityManager am) {
if (Build.VERSION.SDK_INT >= 19) {
return ActivityManagerCompatKitKat.isLowRamDevice(am);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
所以难怪它总是在我的Android 4.0.4设备上返回false.但对我来说,这绝对没有意义.或者我错过了什么?