Android开发 launchar开发


前言

  记录一些launchar开发的技术细节

清单里需要注意的内容

注意,要添加singleTask,否则会出现home键多次创建launchar 应用

  <application>
        <activity
            android:name=".ui.MainActivity"
            android:exported="true"
            android:launchMode="singleTask">
            <intent-filter>
                
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.rayland.home" />
            intent-filter>
        activity>
    application>

屏蔽一些按键防止launchar受影响

    override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            return true
        }
        if (keyCode == KeyEvent.KEYCODE_MENU) {
            return true
        }
        if (keyCode == KeyEvent.KEYCODE_HOME) {
            return true
        }
}

启动桌面应用的方式

    /**
     * 启动应用
     */
    fun startApp(packageName: String) {
        try {
            this@MainActivity.packageManager.getLaunchIntentForPackage(packageName)?.let { intent ->
                startActivity(intent)
            }
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(this, "应用启动失败", Toast.LENGTH_SHORT).show()
        }
    }

    /**
     * 启动应用
     * [packageName] 包名
     * [className] 类名(请注意需要路径+类名)
     */
    fun startApp(packageName: String, className: String) {
        try {
            startActivity(Intent().apply {
                setClassName(packageName, className)
            })
        } catch (e: Exception) {
            e.printStackTrace()
            Log.e("zh", "应用启动失败 : $e" )
            Toast.makeText(this, "应用启动失败", Toast.LENGTH_SHORT).show()
        }
    }

获取系统中安装的应用列表

bean

data class ApplyBean(val name: String?, val icon: Drawable?, val packageName: String?)

获取数据

    private fun getAllApps(): List {
        val packageInfoArray = mutableListOf()
        val applyBeanArray = mutableListOf()
        val pManager = MainApp.getApp().packageManager

        // 获取手机内所有应用
        val packlist = pManager.getInstalledPackages(0)
        for (i in packlist.indices) {
            val pak = packlist[i] as PackageInfo
            // if()里的值如果<=0则为自己装的程序,否则为系统工程自带
            if (pak.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM <= 0) {
                // 添加自己已经安装的应用程序
                packageInfoArray.add(pak)
            } else {
                //apps.add(pak)
            }
        }
        for (pinfo in packageInfoArray) {
            //设置图片
            val icon = pManager.getApplicationIcon(pinfo.applicationInfo)
            //设置应用程序名字
            val appName = pManager.getApplicationLabel(pinfo.applicationInfo).toString()
            //设置应用程序的包名
            val packageName = pinfo.applicationInfo.packageName
            val app = ApplyBean(appName, icon, packageName)
            applyBeanArray.add(app)
        }
        return applyBeanArray
    }

应用变化监听

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)
                || intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)
                || intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
            for (AppPackageListener appPackageListener: mAppPackageListener) {
                appPackageListener.onAppPackageChanged(intent.getAction(), intent.getData());
            }
        }
    }
    
    
    public static void registerReceiver(Context context) {
        mIntentFilter = new IntentFilter();
        mIntentFilter.addDataScheme("package");
        mIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        mIntentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        mIntentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
        context.registerReceiver(mReceiver, mIntentFilter);
    }

End