Android / NFC, вызывайте onNewIntent вместо onCreate, когда приложение приостановлено или остановлено - PullRequest
0 голосов
/ 18 марта 2019

Я разрабатываю приложение, которое читает теги NFC в формате NDEF. Моя цель заключается в том, чтобы приложение либо считывало тег, когда оно запущено, либо запускалось само, а затем читало тег, когда оно в данный момент остановлено или не запущено. Я использую диспетчер переднего плана, поэтому приложение перехватывает все намерения NFC / NDEF, возникающие во время работы на переднем плане. Таким образом, при отладке я вижу, что приложение получает Intent, когда я прикрепляю тег к устройству, и приложение находится на переднем плане. (вызывается onNewIntent, намерение обрабатывается правильно).

Но когда приложение запущено, а не на переднем плане или еще не запущено, вызывается onCreate, и после того, как приложение (вновь) создано, программа NFC устройства по умолчанию запускается с белым экраном, как может. быть замеченным на скриншоте.

Я провел много исследований по этой теме, прочитал много связанных вопросов по SO и несколько раз пытался настроить Манифест, но до сих пор он не работал. Кто-нибудь знает, почему это происходит и как заставить приложение запускаться каждый раз, когда прикрепляется определенный тег? Могу ли я быть, потому что есть ошибка или сбой в сочетании с Xamarin?

Мое устройство - Samsung Galaxy S7 Edge, я использую Xamarin.Forms для разработки приложения. Другой (возможно) связанный с этим вопрос: в чем главное отличие «обычного» AndroidManifest.xml от того, который создается с использованием атрибутов Xamarin в MainActivity?

Ниже приведен мой AndroidManifest.xml и атрибут «Активность моей основной деятельности».

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="100" android:versionName="1.00" package="com.aaa.bbb" android:installLocation="auto">
  <uses-sdk android:minSdkVersion="17" />
  <uses-permission android:name="android.permission.nfc" />
  <uses-permission android:name="android.permission.NFC" />
  <uses-feature android:name="android.hardware.nfc" android:required="true" />
  <application android:label="xxx.Android" android:icon="@drawable/Icon">
    <activity
      android:name=".MainActivity"
      android:label="xxx"
      android:launchMode="singleTop">
      <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.yyy.zzz"/>
      </intent-filter>
    </activity>
  </application>
</manifest>

ActivityAtribute моей MainActivity:

[Activity(Label = "xxx", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, LaunchMode =LaunchMode.SingleTop),
IntentFilter(new[] { "android.nfc.action.NDEF_DISCOVERED" }, DataMimeType = application/vnd.yyy.zzz, Categories = new[] { "android.intent.category.DEFAULT"})]

MainActivity:

protected override void OnNewIntent(Intent intent)
{
    try
    {
        base.OnNewIntent(intent);
        HandleIntent(intent);
    }
    [...]
}

protected override void OnCreate(Bundle savedInstanceState)
{
    try
    {
        if (!m_Created)
        {
            base.OnCreate(savedInstanceState);
            m_Created = true;
            [...]
        }
        HandleIntent(this.Intent);
        [...]
    }
    [...]
}

Снимок экрана стандартного приложения NFC с белым экраном

...