【发布时间】:2012-12-21 16:48:00
【问题描述】:
我正在编写一个(合法的)间谍程序。我想让这个程序隐藏在启动器上(这样就不会显示图标)。我试图从AndroidManifest.xml 中删除<category android:name="android.intent.category.LAUNCHER" /> 行,但随后用户无法以首次启动模式(配置)启动应用程序。谁有什么想法?
我该怎么做?
【问题讨论】:
我正在编写一个(合法的)间谍程序。我想让这个程序隐藏在启动器上(这样就不会显示图标)。我试图从AndroidManifest.xml 中删除<category android:name="android.intent.category.LAUNCHER" /> 行,但随后用户无法以首次启动模式(配置)启动应用程序。谁有什么想法?
我该怎么做?
【问题讨论】:
您需要将您的应用变成一项服务。以下是 Android 创建服务组件的过程:
http://developer.android.com/guide/components/services.html
在 MobiWare 上也发现了这个:
如果您想在用户不知情的情况下跟踪移动设备的使用情况或收集一些数据,这可能会对您有所帮助。
第一步:创建一个没有图标的应用程序。 通常,活动在 manifest 中声明如下。
<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" />
您的代码仅在手机重启时运行。
第 2 步。编写代码
Reboot 后,receiveer 将启动,您可以在此处启动您的服务。
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);
}
}
【讨论】:
您可以从 AndroidManifest.xml 文件中删除 <category android:name="android.intent.category.LAUNCHER"/>。
但请记住添加 <category android:name="android.intent.category.LEANBACK_LAUNCHER"/> 以便 Android Studio 能够编译您的应用程序(但在启动器中隐藏):) :D
【讨论】:
删除
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
来自清单文件
【讨论】:
应用程序可以通过编程方式隐藏,下面是从启动器菜单中隐藏应用程序的代码。这也适用于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")
}
【讨论】: