You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android跨应用启动失败:WiFi广播触发Kotlin应用启动故障求助

问题修复指南:广播接收器未解析+WiFi触发启动应用失败

嘿,我仔细看了你的代码和问题描述,发现几个关键问题,咱们一个个来解决:

1. 先搞定「MyBroadcastReceiver未解析」的报错

你AndroidManifest里注册的广播接收器是.MyBroadcastReceiver,但你实际写的类叫ConnectivityReceiver,名字完全对不上!系统找不到这个类才会报错,赶紧把Manifest里的receiver标签改对:

<receiver android:name=".ConnectivityReceiver" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <!-- 先加上网络变化的action,不过后面要注意高版本的限制 -->
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
</receiver>

2. 解决Android 8.0+的广播失效问题

从Android 8.0(API 26)开始,静态注册的广播接收器不能接收大部分隐式广播,包括CONNECTIVITY_CHANGE——这就是你WiFi连上了但广播没触发的核心原因之一!

咱们换成动态注册的方式,在MainActivity里注册广播:

package com.wifi.wifimann;
import androidx.appcompat.app.AppCompatActivity;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    private ConnectivityReceiver connectivityReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 初始化接收器
        connectivityReceiver = new ConnectivityReceiver();
        // 过滤网络变化的广播
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        // 动态注册
        registerReceiver(connectivityReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 记得注销,不然会内存泄漏
        if (connectivityReceiver != null) {
            unregisterReceiver(connectivityReceiver);
        }
    }
}

3. 修复WiFi判断与应用启动的细节

你的ConnectivityReceiver里还有两个坑:

  • connMgr.getActiveNetwork()可能返回null,直接调用hasTransport()会炸空指针
  • 在广播接收器里启动Activity必须加FLAG_ACTIVITY_NEW_TASK标记

修改后的代码如下:

package com.wifi.wifimann;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;

public class ConnectivityReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connMgr == null) return;
        
        Network activeNetwork = connMgr.getActiveNetwork();
        if (activeNetwork == null) return;
        
        NetworkCapabilities networkAgent = connMgr.getNetworkCapabilities(activeNetwork);
        // 先判空再检查WiFi
        if (networkAgent != null && networkAgent.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
            Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage("com.example.kotkot");
            if (launchIntent != null) {
                // 必须加这个标记,否则非Activity环境启动会报错
                launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(launchIntent);
            } else {
                // 这里可以提示用户目标应用没装
                // Toast.makeText(context, "kotkot应用未安装哦", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

4. 最后补个Android 12+的权限说明

如果你的应用是Android 12(API 31)及以上,需要声明查询其他应用的权限,不然拿不到启动Intent:

<!-- 两种方式选一种:要么全权限,要么只查指定应用 -->
<!-- 方式1:全权限(简单但不够精细) -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

<!-- 方式2:只允许查询kotkot应用(更安全) -->
<queries>
    <package android:name="com.example.kotkot" />
</queries>

按照上面的步骤改完,应该就能正常触发广播并启动kotkot应用了!

内容的提问来源于stack exchange,提问作者mayank deshpande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:45:23