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