繁体   English   中英

Android NFC重定向意图

[英]Android NFC Redirecting intent

当我将nfc标签贴近手机时,我希望启动我的应用程序,因此我将其添加到清单中:

<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> 

这很好。

如果用户未登录,我希望用户先登录,然后才能从标记传输数据,因此我将其添加到我的度量活动的onCreate中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.sessionManager = new SessionManager(this);
    this.sessionManager.login();

    this.setContentView(R.layout.activity_measure);
    this.nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    this.pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);

    this.filters = new IntentFilter[] { ndef, };
    this.techLists = new String[][] { new String[] { android.nfc.tech.NfcV.class.getName() } };

    this.textViewYear = (TextView) findViewById(R.id.measure_textview_year);
    this.textViewMonthDay = (TextView) findViewById(R.id.measure_textview_month_day);
    this.textViewTime = (TextView) findViewById(R.id.measure_textview_time);
    this.textViewGlucose = (TextView) findViewById(R.id.measure_textview_glucose);

    new StartReadTask().execute();
}

但是,由于此实现,用户登录后,他被重定向到我的主菜单:

/**
 * 
 * @param v
 */
@Override
public void onClick(View view) {
    String username = this.textEditUsername.getText().toString();
    String password = this.textEditPassword.getText().toString();

    if(username.trim().length() > 0 && password.trim().length() > 0){
        if(username.equals("test") && password.equals("test")){
            this.sessionManager.createLoginSession("Test-Name", "Test-Email");

            Intent intent = new Intent(this.getApplicationContext(), MainActivity.class);

            this.startActivity(intent);
            this.finish();
        } else {
            this.dialogAlertManager.showAlertDialog(LoginActivity.this, "Login failed..", "Username or Password is incorrect", false);
        }               
    } else {
        this.dialogAlertManager.showAlertDialog(LoginActivity.this, "Login failed..", "Please enter username and password", false);
    }
}  

这里提到的“ MainActivity”是我的主菜单。 但是我希望该活动重定向到我的测量活动,但是我不知道该怎么做。 在“正常”登录后,没有nfc意图,我需要将应用程序重定向到主菜单,但是具有nfc意图,我希望它重定向至测量活动。

另外,当用户已经登录时,我希望立即传输标签的数据。 现在,如果我要传输数据,我必须将标签保持在手机附近以开始测量活动,而不是将其放回并再次返回以传输数据。

我该怎么办?

您正在用同一代码处理许多不同的事情:读取nfc,访问ui字段,控制活动流。 (是的,Android示例代码通常会给出错误的示例)

您需要处理一些特殊情况,例如当用户刚开始登录然后读取标签时发生的情况。 获得此权利的唯一机会是将代码中的不同职责分开。

可以肯定的是:读取标签时,您需要存储信息。 因此,您可以做出不同的反应,并最终在用户登录后显示它。当涉及到不同的活动时,您可能需要将数据存储在某种中央实体中,例如单例。 (或者,当您从活动转移到另一个活动时,始终将信息与意图一起发送)

对于NFC的阅读,我发现Google提供了一个示例应用程序“ NFC-HUNT”。 具有一些特殊功能:

  1. 它使用没有UI的特殊活动来读取NFC标签。 这样,NFC读取就被封装了,您的应用程序的其余部分根本没有NFC代码。 此活动(称为NFCShimActivity)只是准备了信息,然后创建一个意图来启动您的常规UI。

  2. 通常,当一个活动可见并且该活动的新意图到达时(因为已读取NFC标签),将打开该活动的另一个实例。 正是您不想要的。

解决方案是在清单中设置android:launchMode="singleTask" ,并在Activity中实现此方法:

  public void onNewIntent(Intent intent) {...}

我写了一篇有关nfc代码读取结构的博客文章,也许它可以帮助您使其更易于理解

http://meier-online.com/zh/2014/09/nfc-hunt-analysed/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM