簡體   English   中英

廣播接收器未啟動活動

[英]BroadCast Receiver not launching activity

我正在實現一個隱藏的應用程序。 我想隱藏手機中的應用程序並在我撥打某個號碼時啟動它。

首先,我在清單上聲明了一個別名活動,並將其隱藏。 它是 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 沒有。 我已經嘗試向意圖添加標志並開始通過包查找它的意圖。 但意圖似乎不起作用。 日志“receeeeeeeeiving”也出現了。

嘗試這個

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();
}

嘗試這個:

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);

最初安裝應用程序時,它處於“已停止”狀態。 它保持在停止狀態,直到用戶明確啟動其活動之一。 如果用戶強行關閉應用程序,則它將返回到停止狀態。

當應用程序處於停止狀態時,將不會調用任何廣播接收器。 我懷疑根本無法調用BroadcastReceiver的唯一原因是因為您在開發過程中的某個時候啟動了主要活動。 現在,被禁用,它將無法運行。 如果您要將此應用安裝在全新的設備上(或強行關閉該應用以將其重置為停止狀態),您將什至看不到日志和吐司。

對此有多種解決方案:

  • 您在清單中提供 SYSTEM_ALERT_WINDOW,然后將用戶(在運行時)重定向到“繪制其他應用程序”設置。 這樣,您就可以在 Android 10 或更高版本上啟動任何后台/已終止的活動。

對於那些在 MIUI OS 手機(小米)上遇到相同問題的人,您有多種解決方法:

  • SYSTEM_ALERT_WINDOW 不能用小米手機救你。 因此,您需要一個 AccessibilityService 來繞過 MIUI 限制,否則,您可以只設置一個全屏高優先級通知,如果手機處於“空閑”狀態,它肯定會啟動活動。 如果用戶正在使用手機,通知會出現在抽屜中,並且只有在用戶點擊它時才會啟動活動。

這些都是非root解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM