startActivity 没有被带到前台

问题描述 投票:0回答:1

我的应用程序中有以下场景。开始时,它会打开并请求

RECORD_AUDIO
权限并记录“x”多秒的音频。我希望应用程序在
RECEIVE_BOOT_COMPLETED
.

上运行

AndroidManifest.xml

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.App_Test"
        android:exported="true"
        android:hardwareAccelerated="false"
        android:largeHeap="true">

        <activity android:name="com.example.app_test.MainActivity"
            android:exported="true"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name="com.example.app_test.BootCompletedReceiver"
            android:label="StartMyServiceAtBootReceiver"
            android:exported="true"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

MainActivity.kt 如下所示:

class MainActivity : AppCompatActivity() {

    // Define audio recording variables
    private val sampleRate = 44100
    private val channelConfig = AudioFormat.CHANNEL_IN_MONO
    private val audioFormat = AudioFormat.ENCODING_PCM_16BIT
    private val audioPermission = 1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Toast.makeText(this, "I'm in MainActivity", Toast.LENGTH_LONG).show();
        setContentView(R.layout.activity_main)

        // Call the recordAudio() method to record audio
        recordAudio()
        // Finish and close the application.
        finishAndRemoveTask()
    }


    private fun recordAudio() {...}

BootReceiver.kt 看起来像这样……

class BootCompletedReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == Intent.ACTION_BOOT_COMPLETED) {
            val mainActivityIntent = Intent(context, MainActivity::class.java)
            Toast.makeText(context, "Kotlin Device restarted", Toast.LENGTH_LONG).show()
            mainActivityIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
            Toast.makeText(context, "Flagg Added", Toast.LENGTH_LONG).show()
            context?.startActivity(mainActivityIntent)
        }
    }
}

我曾尝试使用 Handler()

Handler(Looper.getMainLooper()).postDelayed(...
来启动意图,但这也没有用。

我应该使用

BootCompletedReceiver
来启动启动活动的服务吗? 查看 Logcat,我可以看到正在调用 MainActivity,它只是没有被提出来。

感谢所有帮助。提前致谢!

我曾尝试使用 Handler()

Handler(Looper.getMainLooper()).postDelayed(...
来启动意图,但这也没有用。

android kotlin android-intent android-activity android-permissions
1个回答
0
投票

如果

startActivity()
没有将您的活动带到前台,可能是由于多种原因。以下是一些可能的原因和解决方案:

  1. 活动已经在运行:如果您尝试启动的活动已经在运行,
    startActivity
    () 方法不会将其带到前台。相反,您可以使用
    FLAG_ACTIVITY_REORDER_TO_FRONT
    标志将活动的现有实例置于最前面。您可以像这样将此标志添加到您的意图中:
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
  1. Activity不在同一个任务中:如果你尝试启动的Activity与当前Activity不在同一个任务中,则不会被带到前台。在这种情况下,您可以使用
    FLAG_ACTIVITY_NEW_TASK
    标志在新任务中启动活动。您可以像这样将此标志添加到您的意图中:
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
  1. The activity is not the top-most activity in the task:如果你尝试启动的activity不是任务中最顶层的activity,它不会被带到前台。在这种情况下,您可以使用
    FLAG_ACTIVITY_CLEAR_TOP
    标志将活动置于最前面,并清除其上的所有其他活动。您可以像这样将此标志添加到您的意图中:
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
© www.soinside.com 2019 - 2024. All rights reserved.