如何在 AndroidManifest 中指定多个活动,一个用于启动屏幕,一个用于 mainactivity - 将原始意图传递给 mainactivy

Posted

技术标签:

【中文标题】如何在 AndroidManifest 中指定多个活动,一个用于启动屏幕,一个用于 mainactivity - 将原始意图传递给 mainactivy【英文标题】:How do I specify multiple activities in AndroidManifest one for splash screen, one for mainactivity - pass the original intent to the mainactivy 【发布时间】:2021-11-18 17:13:34 【问题描述】:

我只是 android 新手,这是我的第一个应用程序。

我正在开发一个应用程序,当 NFC 读取器检测到包含 NDEF 消息的 TAG 时触发,特别是在检测到与我的域匹配的 URL 时。

我想添加一个由 Android INTENT 触发的启动画面,然后将原始 INTENT 传递给 mainactivity 以进行进一步处理,我已经开始但不知道如何结合清单和代码来做什么我在追求。

清单.XML

    <activity
        android:name=".SplashScreenActivity"
        android:theme="@style/Theme.MyApp.SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".MainActivity" android:theme="@style/Theme.MyApp.NoActionBar">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="http"
                  android:host="<my custom domain>"/>
        </intent-filter>
    </activity>

关于我应该如何构建我的 Manifest 以处理这种情况的任何帮助,SplashScreenActivity 我可以在这里使用意图过滤器来确保它被触发,但随后我创建了一个新的意图,这意味着丢失 NDEF 额外内容。

    public class SplashScreenActivity extends AppCompatActivity 
        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            startActivity(new Intent(SplashScreenActivity.this, MainActivity.class));
            finish();
        
    

我希望能够将整个原始意图“传递”给 mainactivity,但我不确定如何执行此操作。

这是从 INTENT 中提取 NDEF 消息的代码,任何想法都值得赞赏。

private void readFromIntent(Intent intent) 
    

    String action = intent.getAction();


    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
            || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) ||
            NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) 
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        logViewModel.insert(new LogEntry("READFROMINTENT ACTUALLY FIRED", "Action " + intent.getExtras()));
        if (rawMsgs != null) 
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; i++) 
                msgs[i] = (NdefMessage) rawMsgs[i];
            
            getNdefRecords(msgs);
            addLinkToDbFromRecord(records);
        
        //buildTagViews(msgs);
    



【问题讨论】:

【参考方案1】:

所以我设法通过执行以下操作来解决这个问题。

我将意图过滤器从 MainActivity 移动到 .splashscreen 活动,将 mainactivity 的类别更改为 DEFAULT,并允许闪屏活动保持为 LAUNCHER

 <activity
        android:name=".MainActivity"
        android:theme="@style/Theme..NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity android:name="com.myap.app.SplashScreenActivity"
        android:theme="@style/Theme.myapp.SplashTheme">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="http"
                  android:host="my domain"/>
        </intent-filter>
</activity>

在我的启动画面活动中,我使用以下代码从原始意图中复制附加内容,将操作设置为 mainactivity 旨在处理的预期操作,并使用它来启动主要活动

public class SplashScreenActivity extends AppCompatActivity 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        Intent startMainActivity = new Intent(SplashScreenActivity.this, MainActivity.class);

        startMainActivity.putExtras(getIntent());

        startMainActivity.setAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
        startActivity(startMainActivity);

        finish();
    

【讨论】:

以上是关于如何在 AndroidManifest 中指定多个活动,一个用于启动屏幕,一个用于 mainactivity - 将原始意图传递给 mainactivy的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Webpack 插件中指定多个加载器?

如何使用多个条件查找查询在 MongoDB 中指定字段?

如何在 devenv 任务中指定多个构建类型,CruiseControl.net

如何在 Thor 中指定多个参数或参数?

如何在 Django 的设置文件中指定多个“init_command”

Spring Cloud Bus,如何在 /bus/refresh?destination= 中指定多个目的地?