【问题标题】:BroadCast Receiver not launching activity广播接收器未启动活动
【发布时间】:2018-03-07 13:10:09
【问题描述】:

我正在实现一个隐藏的应用程序。我想在手机中隐藏应用程序,并在我拨打某个号码时启动它。

首先,我在清单上声明了一个别名活动,然后将其隐藏。它是 MainActivity2:

public class Main2Activity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    PackageManager p = getPackageManager();
    ComponentName LAUNCHER_COMPONENT_NAME = new ComponentName(
            "com.example.susan.oculta.launcher", "com.example.susan.oculta.launcher.Launcher");
    p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);...

一些清单行:

<activity-alias
        android:name=".launcher.Launcher"
        android:targetActivity=".launcher.Main2Activity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>

使用此代码,我可以隐藏图标。

我还有一个广播接收器。这个:

public class LaunchAppViaDialReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    if (null == bundle)
        return;
    String phoneNubmer = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    //here change the number to your desired number
    if (phoneNubmer.equals("12345")) {
        Log.i("reciving", "receeeeeeeeeiving");

        Intent i = new Intent();
        i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setClass(context, MainActivity.class);
        context.startActivity(i);

        setResultData(null);
        Toast.makeText(context, "aaaa", Toast.LENGTH_LONG).show();

    }
}

}

问题是,当我拨打“12345”时,Toast 会出现,但 MainActivity 却没有。我已经尝试向意图添加标志并开始通过包查找它的意图。但意图似乎不起作用。 日志“receeeeeeeeeiveing”也会显示出来。

【问题讨论】:

  • 我在几部手机上尝试了相同的代码,它有时有效,有时无效。 MIUI OS似乎与此有关。无论如何,我做了一个解决方法。接到电话时我开始通知。从那里,用户可以按下通知并开始主要活动。适用于我的应用

标签: android broadcastreceiver hidden


【解决方案1】:

试试这个

if (phoneNubmer.equals("12345")) {

     Log.i("reciving", "receeeeeeeeeiving"); 
     Intent i = new Intent(context, MainActivity.class);
     i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
     context.startActivity(i);
     Toast.makeText(context, "aaaa", Toast.LENGTH_LONG).show();
}

【讨论】:

  • 它不起作用,Log 和 Toast 出现,但没有活动
【解决方案2】:

试试这个:

Intent i = new Intent();
String packageName = context.getPackageName();
ComponentName componentName = new 
ComponentName(packageName, packageName + "your_ALIAS_ACTIVITY");
i.setComponent(componentName);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);

【讨论】:

  • 如果我调用别名活动,应用程序崩溃,因为它被禁用。如果我调用 ComponentName(packageName, packageName + "myMainActivity");行为是一样的:toast 和 log 出现了,但是 Activity 没有显示
【解决方案3】:

最初安装应用时,它处于“停止”状态。它一直处于停止状态,直到用户明确启动其活动之一。如果用户强制关闭应用,则返回停止状态。

当一个应用程序处于停止状态时,它的任何广播接收器都不会被调用。我怀疑你的 BroadcastReceiver 被调用的唯一原因是因为你启动了你的主在开发过程中的某个时间点的活动。现在,被禁用,它不会运行。如果您要在新设备上安装此应用程序(或强制关闭它以将其重置为停止状态),您甚至不会再看到您的日志和 toast。

【讨论】:

  • 感谢您的回答。我不这么认为,因为如果我不使用这部分:PackageManager p = getPackageManager();组件名称 LAUNCHER_COMPONENT_NAME = 新组件名称(“com.example.susan.oculta.launcher”,“com.example.susan.oculta.launcher.Launcher”); p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);活动仍未显示。当然,我需要设置一个服务来保持广播接收器的存活,但我认为这不是问题。
【解决方案4】:

对此有多种解决方案:

  • 您在 Manifest 中提供 SYSTEM_ALERT_WINDOW,然后将用户(在运行时)重定向到“绘制其他应用程序”设置。这样,您就可以在 Android 10 或更高版本上启动任何后台/已终止 Activity。

对于那些在 MIUI OS 手机(小米)上遇到相同问题的人,您有多种解决方法:

  • SYSTEM_ALERT_WINDOW 无法用小米手机拯救你。因此,您需要一个 AccessibilityService 来绕过 MIUI 限制,否则,您可以设置一个全屏高优先级通知,如果手机处于“空闲”状态,肯定会启动活动。如果用户正在使用手机,则通知会显示在抽屉中,并且只有在用户点击它时才会启动活动。

这些都是非根解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多