如何在 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 devenv 任务中指定多个构建类型,CruiseControl.net