安卓App自启动,两种不同的方式!!!支持到安卓4.4

初衷

自己给车机买了CarPlay盒子,但是车机启动后需要点击App才能使用,十分拉闸!!!所以做了这个自启动器。

README!

因为
它是apk文件
它是基于安卓4.4开发的

所以
它能安装到所有的安卓平台上
它只能安装到安卓4.4以后的机子上

开发

开机程序自启代码【主要在AndroidManifest.xml】

// An highlighted block
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="internalOnly"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!--    悬浮窗-->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.APP_MAPS"/>
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <receiver
            android:name=".BaseReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

主要的逻辑代码

//展示包名
        try {
            Context ctx = MainActivity.this;
            PackageManager packageManager = ctx.getPackageManager();
            //获取所有安装的app
            List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
            ArrayList<String> listItem = new ArrayList<String>();
            for(PackageInfo info : installedPackages){
                String packageName = info.packageName;//app包名
                ApplicationInfo ai = packageManager.getApplicationInfo(packageName, 0);
                String appName = (String) packageManager.getApplicationLabel(ai);//获取应用名称
                String showItem = appName + "____" + packageName;
                listItem.add(showItem);
            }
            ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItem);

            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new MyOnItemClickListener());
        }catch (Exception ex){}
        //申请悬浮窗权限
        try{
            //检查是否已经授予权限,大于6.0的系统适用,小于6.0系统默认打开,无需理会
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
                //没有权限,须要申请权限,由于是打开一个受权页面,因此拿不到返回状态的,因此建议是在onResume方法中重新执行一次校验
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
                intent.setData(Uri.parse("package:" + getPackageName()));
                startActivity(intent);
            }
        }catch (Exception ex){}
        //启动跳转程序
        String ss = "";
        try{
            //启动从文件中读取包名字
            Context ctx = MainActivity.this;
            SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
            EditText editText = findViewById(R.id.txtPackName);
            editText.setText(sp.getString("PKG", "none"));
            ss = sp.getString("PKG", "none");
        }catch (Exception ex){}
        //第一种方式启动
        try {
            if(!ss.equals("none")){
                Intent intent = getPackageManager().getLaunchIntentForPackage(ss);
                if (intent != null) {
                    intent.putExtra("type", "110");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            }
        }
        catch(Exception ex) {}
        //第二种方式启动
        try {
            if(!ss.equals(("none"))){
                Intent intent = new Intent();
                ComponentName cn = new ComponentName(ss, ss+".MainActivity");
                intent.setComponent(cn);
                startActivity(intent);
            }
        }catch (Exception ex){}

效果

启动后调到对应的App
在这里插入图片描述

结语

接触Android半天,简单搞了一下的作品,大佬手下留情,望海涵!
ps:
坑是真多
1、Debug的apk安装不到车机上
2、自己的安卓车机是厂家定制的没有开机广播…所以把应用做成了桌面应用
3、Android studio竟然是全英文的,没有官方汉化…
都是泪…

Android Studio中实现App开机自启动的方法有多种。以下是其中一种方法: 1. 在AndroidManifest.xml文件中添加权限声明和广播接收器声明: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application ...> ... <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> ... </application> ``` 2. 创建一个广播接收器类BootReceiver.java,继承自BroadcastReceiver,并在onReceive()方法中处理开机自启动的逻辑: ```java public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { // 在这里执行开机自启动的逻辑 // 例如启动你的App的主Activity Intent launchIntent = new Intent(context, MainActivity.class); launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(launchIntent); } } } ``` 3. 在AndroidManifest.xml文件中注册广播接收器: ```xml <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> ``` 这样,当设备开机完成后,系统会发送一个ACTION_BOOT_COMPLETED广播,然后你的App的BootReceiver接收到该广播后就可以执行开机自启动的逻辑了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值