安卓隐藏应用

24
我正在编写一个(合法的)间谍程序。我希望能够隐藏该程序在启动器中的图标。我尝试从AndroidManifest.xml中删除<category android:name="android.intent.category.LAUNCHER" />行,但这样用户无法在第一次启动模式(配置)中启动应用程序。有什么好的想法吗?你们能帮忙解决吗?
如何实现这个功能?
4个回答

35

您需要将您的应用程序变成一个服务。以下是Android关于创建服务组件的方式:

http://developer.android.com/guide/components/services.html

在MobiWare上也找到了这个:

如果您想追踪移动设备的使用情况或收集一些用户不知道的数据,这可能会对您有所帮助。

步骤1:创建一个没有图标的应用程序。通常,在清单中声明一个活动如下所示。

     <activity
        android:label="@string/app_name"
        android:name="org.security.tracker.Tracker-activity" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

去掉分类标签,就不会再得到应用图标。 现在,您不需要活动了。因此,请删除此部分。 但是您可能会想,没有任何触发器该应用程序如何运行或者应用程序的起点是什么。 这就是解决方案。

<!-- Start the Service if applicable on boot -->
    <receiver android:name="org.security.tracker.ServiceStarter" >
        <intent-filter >
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

这将触发您在 Receiver 中编写的代码,从而可以运行服务来实现您的想法。

 <service android:name="org.security.tracker.serviceCode" />

你需要添加这个权限。

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

你的代码仅在手机重启时运行。

第二步:编写你的代码

当手机重启时,广播接收器会被触发,然后你可以启动你的服务。

class ServiceStarter extends BroadcastReceiver {

@Override
public void onReceive(Context _context, Intent _intent) {

    Intent i = new Intent("com.prac.test.MyPersistingService");
    i.setClass(_context, ServiceCode.class);
    _context.startService(i);
  }

 }

7
如果AndroidManifest中没有LAUNCHER类别,Android Studio将无法编译。 - Plugie
如果您无法启动应用程序,Android Studio仅在第一次编译时不会执行服务代码。 - abh22ishek
直到我启动了一次活动,才能在BroadcastReceiver中收到任何调用。 - Amol Patil
嗨,我正在尝试跟随你的示例 - 你能澄清一下MyPersistingService和ServiceCode是什么吗?我很难理解它们是如何实现的。 - mama

5
你可以从AndroidManifest.xml文件中删除<category android:name="android.intent.category.LAUNCHER"/>
但是请记得添加<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>,这样Android Studio才能编译您的应用程序(尽管在启动器中隐藏):) :D。

3

删除

<intent-filter >
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

从清单文件中


@AmitApollo,不需要创建服务。 - user744251
5
这个应用程序将如何启动? - Squonk
2
@Squonk 我不是专家,但也许它是一个广播接收器? - Ricardo Cristian Ramirez
@RicardoCristianRamirez:除非用户“启动”应用程序,否则无法启动任何Android应用程序组件。这包括服务和广播接收器-出于安全原因,Android的许多版本都是这样的。 - Squonk
它不会工作,Android Studio 只会编译。它会说“找不到默认活动”。 - abh22ishek

-2

应用程序可以通过编程方式隐藏,以下是代码,它将从启动器菜单中隐藏应用程序。这在Android 10上也可以正常工作。

// App will be hidden when this method will be called from menu
private fun hideApp() {

    val packageManager =packageManager
    val name =ComponentName(this,MainActivity::class.java)
    packageManager.setComponentEnabledSetting(name,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP)
    Log.d("TAG", "hideApp: success")
}

更多信息请查看此链接https://developer.android.com/reference/android/content/pm/PackageManager#setComponentEnabledSetting(android.content.ComponentName,%20int,%20int)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接