• PackageManager packageManager = getPackageManager(); ComponentName componentName = new ComponentName(this, StartActivity.class); int res = packageManager.getComponentEnabledSetting(com
            PackageManager packageManager = getPackageManager();
            ComponentName componentName = new ComponentName(this, StartActivity.class);
            int res = packageManager.getComponentEnabledSetting(componentName);
            if (res == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
                    || res == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
                // 隐藏应用图标
                packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                        PackageManager.DONT_KILL_APP);
            } else {
                // 显示应用图标
                packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
                        PackageManager.DONT_KILL_APP);
            }

    复制代码


    第一种:在入口的activity oncreat()加上:

    [java] view plain copy
     print?在CODE上查看代码片派生到我的代码片
    1. PackageManager p = getPackageManager();  
    2. p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, PackageManager.DONT_KILL_APP);  

    第二种:在manifest入口activity标签里面intent-filter中设置<data></data>元素,比如:

    [html] view plain copy
     print?在CODE上查看代码片派生到我的代码片
    1. <data android:host=”AuthActivity” android:scheme=”com.android.example” />  



    Android APP安装后不在桌面显示图标的应用场景举例和实现方法

    最近在为公司做一款车联网的产品,由于公司本身擅长于汽车解码器的研发,所以该产品的诊断功能的实现除了使用目前市面上车联网产品中大量使用的OBD协议外,还会使用一些专车专用协议去实现一些特殊的诊断功能,如升窗降窗、保养归零、读TPMS数据流等。公司的想法是把这些专车专用的诊断当成一种付费服务提供给用户,即用户在免费使用基于OBD协议实现的诊断功能外,若想使用专车专用协议实现的某个特殊功能则需要按每个功能多少钱的形式付费(本人不太赞成靠这种方式赚钱,觉得还是免费的好)。

    我主要负责这款车联网产品中Android APP的开发,对于实现前面所提及的这个产品需求,我们准备把每款车的特殊功能诊断程序做成一个个的子程序,即一个个的子APK,之所以选择这样的一种方式,原因在于:①当前市面上车型很多,每个车型对应的同一个特殊功能的诊断程序因汽车协议不同而不一样,若全部程序都放在一个APP中,势必会造成APP过大,后期也不好维护;②提供这些特殊功能的初衷是为了迎合专业的汽车维修人员和车辆改装发烧友(以下称为“专业用户”)的需求,很可能大部分普通用户都不会去使用,这样能更方便需要的用户下载。

    为了在用户安装了子APK之后不至于让用户的桌面全是各种图标(本人很讨厌手机桌面太乱),体验太差且让程序的入口还能集中在主APK,只能想办法使用一些小技巧在桌面不显示这些图标。具体实现方式如下:

    1、开发一个名为OpenNoIconAPP.apk的主APP,里面就一个按钮用于点击后打开子APP,核心跳转代码如下:

    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.btn_open_app:
             /*
             * Intent intent = getPackageManager().getLaunchIntentForPackage(
             * "com.example.noicontest"); if (intent != null) { //
             * startActivity(intent); } else { 
             * Toast.makeText(getApplicationContext(), "没有该子APP,请下载安装",
             * Toast.LENGTH_LONG).show(); }
             */
    
            Intent intent = new Intent();
            ComponentName cn = new ComponentName("com.example.noiconapp","com.example.noiconapp.MainActivity");
            intent.setComponent(cn);
            intent.setAction("android.intent.action.MAIN");
            try {
                startActivityForResult(intent, RESULT_OK);
            } catch (Exception e) {
                Toast.makeText(this, "没有该子APP,请下载安装",Toast.LENGTH_SHORT).show();
            }
            break;
    
        default:
            break;
        }
    }
    

    2、开发名为NoIconAPP.apk的子APP(用于主APP去打开),该APP主要实现在桌面不显示图标。其中要想不显示桌面图标只需修改AndroidManifest.xml文件即可。具体如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.noiconapp"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.noiconapp.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <!-- 要想在桌面不显示图标,只需注释掉APP入口Activity中的下面这句即可,或者把下面的LAUNCHER改成DEFAULT也行 -->
                <!-- <category android:name="android.intent.category.LAUNCHER" /> -->
            </intent-filter>
        </activity>
    </application>
    </manifest>
    

    3、上面的设置可以让桌面图标不显示的原因:

    一般情况下,当我们的APK在被安装后,系统会自动创建我们的APK程序,系统Launcher(系统桌面应用程序)会自动检测系统已经安装的应用软件的包名,然后把这些APP的图标和名称解析出来后显示在应用程序列表里,一旦我们像上面那样设置不显示APK图标,则APK程序在运行后只会显示在“正在运行”的程序列表中,而不会在桌面上显示图标和名字。如果只是设置APP图标不可见而使用第一种方式(我注释的代码)打开APP是不会成功的,因为这样设置后,包名根本就没有加载到Launcher,所以通过 getPackageManager().getLaunchIntentForPackage()方法得到的Intent为null。

    4、其它举例:

    前几天更新了联通“手机应用厅”的最新版Android APP,发现新增加的“网络测速”功能其实是一个子APP,使用的正是这种方式。

    5、示例程序:

    点击下载




    展开全文
  • 如果你的应用需要隐藏图标,那么这篇文章接下来的段落对你可能有所帮助。   在找到本文之前,你也许已经尝试过诸如以下的解决方案: 1,AndroidManifest.xml文件中在入口Activity的intent-filter里去掉,...

    如果你的应用需要隐藏图标,那么这篇文章接下来的段落对你可能有所帮助。

     

    在找到本文之前,你也许已经尝试过诸如以下的解决方案:

    1,AndroidManifest.xml文件中在入口Activity的intent-filter里去掉<category android:name=”android.intent.category.LAUNCHER” />,或者将LAUNCHER改为DEFAULT

    2,在程序中加入下面的代码

    显示图片:

    1. PackageManager p = getPackageManager();
    2. p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    隐藏图标:

    1. PackageManager p = getPackageManager();
    2. p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

    PackageManager.COMPONENT_ENABLED_STATE_ENABLED //显示应用图标

    PackageManager.COMPONENT_ENABLED_STATE_DISABLED //隐藏应用图标

    我用这俩个值来显示和隐藏应用图标有问题,隐藏以后就无法在显示应用图标了,在设置里的所有应用里也找不到了;

    PackageManager.COMPONENT_ENABLED_STATE_DEFAULT //显示应用图标

    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER  // 隐藏应用图标

    将参数值该成这两个值就没有问题了,建议使用这两个值,

    3,去掉android:icon=”@drawable/ic_launcher”中的资源啊,等等等等。。。

    但是试过了每一种方法之后你都发现起到了作用但是却产生了其他的问题

    这里先一个一个的解释下,

    如果去掉<category android:name=”android.intent.category.LAUNCHER” />,就表示app没有启动入口了,这样子确实是解决了不显示图标的效果,但是那样的话我们的应用也运行不了了。头疼~~~

    第二种 ,我们来看看android developer 上的说明:

    public static final int COMPONENT_ENABLED_STATE_DISABLED

    Flag for setApplicationEnabledSetting(String, int, int) and setComponentEnabledSetting(ComponentName, int, int): This component or application has been explicitly disabled, regardless of what it has specified in its manifest.

    意思是,即使你在manifest中声明了这个component或application,当你设置为COMPONENT_ENABLED_STATE_DISABLED时,他们都是不可用的。也就是说,如果你在MainActivity中这样设置了,那么应用图标不会显示,应用也不会运行。

    那么,这也是不可行的~~~

    第三种就不说了,我觉得是狗急跳墙的做法。

     

    ———————————分割线—————————————

     

    接下来我要说的这种方法可以隐藏图标,同是也可以正常启动运行。

    在manifest的入口activity里面intent-filter中设置<data></data>元素。

    比如:

    <data android:host=”AuthActivity” android:scheme=”com.android.example” />

    注意,android:scheme是大小写敏感的,必须以小写字母开头

    也就是这个MainActivity可以响应Uri为com.android.example://AuthActivity的特定 Intent

    但是为什么加入这个之后app就不显示图标了呢?

    因为我们把app的入口Activity申明为由接收隐士的Intent来启动,这样自然也就不会显示图标了。

    好了,如果需要显示图标的话而且也必须响应上述Uri的话,那么我们可以在该Activity中再加入一个intent-filter标签,将data元素移到新建的标签中。这样应用既可以显示图标又可以响应特定的Uri了。

     

    参考文章:

    http://developer.android.com/guide/topics/manifest/intent-filter-element.html

    http://wikidroid.sinaapp.com/AndroidManifest.xml_data

    展开全文
  • 隐藏应用功能的需求 在Android的设备上的应用分为系统应用和用户自己安装的应用。其中系统应用是无法删除的,但是部分用户不用系统应用又无法删除,“眼不见为净”,就可以使用隐藏功能将其隐藏起来。有的部分...

    隐藏应用功能的需求

    在Android的设备上的应用分为系统应用和用户自己安装的应用。其中系统应用是无法删除的,但是部分用户不用系统应用又无法删除,“眼不见为净”,就可以使用隐藏功能将其隐藏起来。有的部分应用可能不想被其它人使用(想你借手机玩的人),就可以使用隐藏功能将其隐藏起来。


    隐藏应用功能涉及的知识

    1.GridView

    GridView是Android中的数据显示控件之一。GridView的视图排列方式与矩阵类似,当屏幕上有很多元素(文字、图片或其他元素)需要显示时,可以使用GirdView。既然有多个元素要显示,就需要使用BaseAdapter来存储这些元素。用户可能会选择其中一个元素进行操作,这就需要设置事件监听setOnItemClickListener来捕捉和处理事件。

    2.数据持久化

    1) 使用Preferences存储应用程序数据

    Preferences是一种轻量级的数据存储机制,他将一些简单的数据类型的数据,包括boolean类型,int类型,float类型,long类型 以及String类型的数据,以键值对的形式存储在应用程序的私有Preferences目录(/data/data/<包名>/shared_prefs/)中,这种Preferences机制广泛应用于存储应用程序中的配置信息。

    2)文件I/O

    Android平台主要通过java.io.FileInputStream和java.io.FileOutputStream这两个类来实现对文件的读写,java.io.File类则用来构造一个具体指向某个文件或者文件夹的对象。

    需要注意的是:每个应用程序所在的包都会有一个私有的存储数据的目录,只有属于这个包中的应用程序才有写入的权限,每个包中应用程序的私有数据目录位于 Android系统中的绝对路径/data/data/<package>/目录中,除了私有目录,应用程序还拥有/sdcard目录即 Android设备上的SD卡的写入权限。文件系统中其他的系统目录,第三方应用程序都是不可写的。

    3)SQLite数据库

    在实际的应用程序编写中,为了更好的对SQlite数据的创建,打开,更改进行管理,往往会编写一个SQLiteOpenHelper的数据库辅助类来帮助我们创建和打开数据库。

    利用SQLiteDatabase对象操作数据库,他除了提供execSQL()和rawQuery()这种直接对SQL语句解析的方法外,还针对insert,upate,delete,select等操作专门定义了相关的方法。

    Cursor的使用:查询数据库均会把查询的结果包装在一个Cursor的子类对象中返回。

    4)ContentProvider

    当数据需要在应用程序之间共享时,我们就可以用ContentProvider为数据库定义一个URI。之后其他应用程序对数据进行查询或者修改时候,只需要从当前上下文对象获得一个ContentResolver传入相应的URI就可以了。

    隐藏应用功能详细设计

    隐藏应用主要涉及一下四个数据类型

    名称

    类型

    作用

    mApps

    List

    存放设备上所有安装应用的包名

    mDisApp

    List

    存放显示的应用的包名

    hm

    HashMap

    存放包名与Flag的键值对

    DB

    SQLite数据库

    存放用户关于隐藏的设置


    用户在操作的过程中可能安装或者卸载应用,所以要考虑hm与DB中数据的一致性,保证两者的一致性是在Activity的生命周期中的onStop()和onCreate()中完成的,两者的流程图如下所示:





    展开全文
  • 限制了在启动器中隐藏应用图标的功能。除非满足以下任一条件,否则应用必须具有图标: 它是系统应用,即使是更新后的应用。 它是托管式配置文件管理应用(工作资料所有者)。 它未请求任何权限。 它不包含任何组件...

    隐藏应用图标这个功能应该用的很少!毕竟用到这个功能的应用可想而之(手动滑稽)

    隐藏图标的实现方式我想在网上查到很多了有在AndroidManifest实现的也用通过如下代码实现的

      /**
         * 启动组件
         * @param componentName 组件名
         */
        private void enableComponent(ComponentName componentName) {
            //此方法用以启用和禁用组件,会覆盖Androidmanifest文件下定义的属性
            PackageManager mPackageManager=getPackageManager();
            mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
        }
    
        /**
         * 禁用组件
         * @param componentName 组件名
         */
        private void disableComponent(ComponentName componentName) {
            PackageManager mPackageManager=getPackageManager();
            mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
        }
    

    但是这些实现方式在Android 10系统上面好像不是那么有用!

    为什么android10系统隐藏图标无效

    Android 10
    限制了在启动器中隐藏应用图标的功能。除非满足以下任一条件,否则应用必须具有图标:
    它是系统应用,即使是更新后的应用。
    它是托管式配置文件管理应用(工作资料所有者)。
    它未请求任何权限。
    它不包含任何组件(例如,Activity、内容提供程序、广播接收器和服务)。
    具有图标且拥有已启用的可启动 Activity 的应用不受影响。除了上面列出的例外情况,所有应用均会显示一个图标。如果应用没有图标,则会显示默认的系统图标。点按没有可启动 Activity 的应用图标时会打开应用信息屏幕。

    看到这里是不是明白了为什么Android 10无法隐藏图标了,但是产品经理不听这些!就是要实现这个功能!那到底这个功能怎么适配Android 10呢!干货来了

    利用activity-alias 这个是做啥的这里就不叙述了!实现的原理也很简单!就是针对Android 10系统给应用生成两个应用图标!主应用图标和副应用图标!副应用图标默认为透明图标,并且默认不显示!在调用隐藏图标的时候隐藏主应用图标,显示副图标!因为副图标是透明的所以在桌面是看不到的!(虽然看不到 但是还是实际存在的)
    上代码

      <activity android:name=".MainActivity"
                android:launchMode="singleInstance"
                >
                <intent-filter>
    
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".Acitivity1"
                android:excludeFromRecents="true"
                android:exported="false"
                android:finishOnTaskLaunch="false"
                android:launchMode="singleInstance"
                android:theme="@style/KeepLiveTheme"/>
    
    
            <activity-alias
                android:name=".MainAliasActivity"
                android:targetActivity=".Acitivity1"
                android:label=""
                android:icon="@drawable/icon"//这里用透明图标
                android:enabled="false">//这个要为false 不然默认会显示两个图标
    
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
    
            </activity-alias>
    

    icon文件

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
    
        <solid android:color="#00000000"/>
    
    </shape>
    

    Activity1是一个透明并且只有1像素的activity

    public class Acitivity1 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
    
            Window window = getWindow();
            // 设置窗口位置在左上角
            window.setGravity(Gravity.LEFT | Gravity.TOP);
            WindowManager.LayoutParams params = window.getAttributes();
            params.x = 0;
            params.y = 0;
            params.width = 1;
            params.height = 1;
            window.setAttributes(params);
            finish();
    
        }
    }
    

    这样点击副图标也不会显示跳转到应用详细信息了 !直接给用户感觉无响应!
    以上就是针对Android 10系统做的一个方案!有用的话可以看看 没用的话就当看个热闹
    demo地址

    展开全文
  • android隐藏应用图标

    2018-12-12 15:25:59
    项目开发中有时需要安装没有应用图标的应用,以下提供2中方法供参考使用: 第一种方式,在启动页的activity中添加schema,因为我们把app的入口Activity申明为由接收隐士的Intent来启动,这样自然也就不会显示图标了 ...

    项目开发中有时需要安装没有应用图标的应用,以下提供2中方法供参考使用:

    第一种方式,在启动页的activity中添加schema,因为我们把app的入口Activity申明为由接收隐士的Intent来启动,这样自然也就不会显示图标了

     <activity
                android:name="net.dd.daemon.MainActivity"
                android:theme="@style/OnePixelActivity"
                android:launchMode="singleInstance">
                
                  <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                    <!--此处定义的schema供从外部调用-->
                    <data
                        android:host="net.dd.daemon"
                        android:path="/keep"
                        android:scheme="daemon"/>
                </intent-filter>
     </activity>
    
    启动方式:
     Uri uri = Uri.parse("daemon://net.dd.daemon/keep");
     Intent intent = new Intent(Intent.ACTION_VIEW, uri);
     context.startActivity(intent);
    

    第二种方式,注释掉LAUNCHER

     <activity
                android:name="net.dd.daemon.MainActivity"
                android:theme="@style/OnePixelActivity"
                android:launchMode="singleInstance">
                
                  <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                     <!--此处隐藏了LAUNCHER也就没有了图标-->
                    <!--<category android:name="android.intent.category.LAUNCHER"/>-->
                   </intent-filter>
     </activity>
    

    如果想显示图标又想用隐式调用,只需再添加一个intent-filter之后,做schema处理就可以了,参考如下:

     <activity
                android:name="net.dd.daemon.MainActivity"
                android:theme="@style/OnePixelActivity"
                android:launchMode="singleInstance">
        
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                    
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <!--此处定义的schema供从外部调用-->
                    <data
                        android:host="net.dd.daemon"
                        android:path="/keep"
                        android:scheme="daemon"/>
                </intent-filter>
    
            </activity>
    
    展开全文
  • Android隐藏app应用图标

    2015-07-23 17:30:02
    原本是闲来无事,浏览博客,看到用浏览器地址打开app的文章, 按照文中所述尝试以后,发现app的应用图标居然在桌面不显示了。... <action android:name="android.intent.action.MAIN" /> <category android:na
  • Android隐藏应用程序浅析 手机上有秘密不想被同事、朋友或爱人看到?现在各大主流的手机安全软件纷纷推出“私密空间”或“隐私信箱”等功能,用来存放私密文件。“私密空间”可隐藏你的短信、电话、照片等内容,...
  • 网上搜的大部分隐藏图标方式并不准确,那么多小白隐藏了图标但是application都没运行? 首先科普,这篇文章非常好:https://blog.csdn.net/lindroid20/article/details/51993247/ 先记录网上大部分的信息: 直接...
  • Launcher运行时,会执行LauncherModel...我这里的示列是Launcher第一次加载时,会把Android的键盘应用添加到主页面。所以我需要把该应用隐藏,不 显示在Launcher桌面。这里贴LoadAllApps的部分代码。 // Create t...
  • 要实现和测试这个功能 首先要创建 3个Android App工程 其中两个App实现launcher中隐藏应用程序图标功能 一个App 用来获得他们的图标以及应用名称 并在此应用中点击相应的应用图标时 会启动对应的应用程序.  ...
  • 我们常常在工作中遇到这样一个需求,要在Launcher中隐藏某个应用的启动图标(如预装的输入法、动态壁纸等等)。完成这个需求,首先要了解Launcher加载应用启动图标的过程。以Android4.4为例,Launcher3加载应用图标在...
  • 实际开发中遇到这种需求,要求应用安装后隐藏应用程序图标,同时能够正常启动。在manifest的入口activity里面intent-filter中设置<data></data>元素。
  • 要实现和测试这个功能 首先要创建 3个Android App工程 其中两个App实现launcher中隐藏应用程序图标功能 一个App 用来获得他们的图标以及应用名称 并在此应用中点击相应的应用图标时 会启动对应的应用程序.    ...
  • 去掉主页面的下面标签:    你的应用个图标就看不见了,当然,隐藏是为了自己调用,这要搞的应用就无法启动了。  然后你可以给activity配置个什么的,它就又可以通过其他的方式启动了。
  • Android应用隐藏包名

    2017-09-05 18:41:39
    开发过程中需要对某个应用进行内置并隐藏其包名,可以按照如下代码处理 ApplicationPackageManager.java(frameworks\base\core\java\android\app)中 /** @hide Same as above but for a specific user */ @...
  • 本文主要介绍如何通过修改AndroidManifest.xml清单文件来达到隐藏自身应用的目的,并纠正一些网上流传的方法,此问不是隐藏第三方应用,为了不浪费大家时间,特此说明。
  • Android设置中的应用管理器提供了一个功能,就是【应用停用】功能,这是针对某些系统应用的。当应用停用之后,应用的图标会被隐藏,但apk还是存在,不会删除,核心接口就是PackageManager的...
  • android 10 如何通过代码隐藏桌面图标。 以下的这些方法测试了一下在10以前的系统都是有效的,但在10的系统上是无效的: 1、AndroidManifest.xml中这么设置启动页,然后打包的时候指定启动页 ``` ...
1 2 3 4 5 ... 20
收藏数 65,766
精华内容 26,306