2015-09-17 38 views
3

我试图在对NFC标签的写入操作完成后开始新的activity。我试图用一个处理程序,但它不工作时,标签被writen成功,但处理器犯规启动activity,它应该写操作写入NFC标签后开始新活动

private void formatTag(Tag tag, NdefMessage ndefMessage) 
    { 
     NdefFormatable ndefFormatable = NdefFormatable.get(tag); 

     if (ndefFormatable == null) 
     { 
      Toast.makeText(this, "Tag is not NDEF formatable", Toast.LENGTH_LONG).show(); 
      return; 
     } 

     try 
     { 
      ndefFormatable.connect(); 
      ndefFormatable.format(ndefMessage); 
      ndefFormatable.close(); 
      Toast.makeText(this, "Tag has be written successfully!", Toast.LENGTH_LONG).show(); 
      writeHandler.sendEmptyMessage(0); 

     } 
     catch (Exception e) 
     { 
      Log.e("formatTag: ", e.getMessage()); 
     } 


    } 

    private Handler writeHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      Intent nextActivity = new Intent(WriteCardActivity.this, MainActivity.class); 
      startActivityForResult(nextActivity, 0); 
      WriteCardActivity.this.finish(); 
     } 
    }; 

这里之后推出的清单

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.loyalty.cardplanet.membershipcard" > 

    <uses-permission android:name="android.permission.NFC" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 

    <uses-feature 
     android:name="android.hardware.nfc" 
     android:required="false" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".RegisterActivity" 
      android:label="@string/title_activity_register" > 
     </activity> 
     <activity 
      android:name=".RedeemActivity" 
      android:label="@string/title_activity_redeem" > 
     </activity> 
     <activity 
      android:name=".PurchaseActivity" 
      android:label="@string/title_activity_purchase" > 
     </activity> 
     <activity 
      android:name=".ResetPinActivity" 
      android:label="@string/title_activity_reset_pin" > 
     </activity> 
     <activity 
      android:name=".WriteCardActivity" 
      android:label="@string/title_activity_write_card" > 
     </activity> 
    </application> 

</manifest> 
+0

您是否有任何日志?请在此处添加一个清单 – Gaskoin

+0

我已添加清单 –

+0

尝试在UI上运行线程 – ThomasRS

回答

3

我想通了。我决定使用AlertDialog代替Handler所以我删除了Handler部分并添加这onNewIntent

@Override 
    protected void onNewIntent(Intent intent) { 


     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 

     NdefMessage ndefMessage = createNdefMessage(account+""); 

     writeNdefMessage(tag, ndefMessage); 

     AlertDialog.Builder alertDialog = new AlertDialog.Builder(WriteCardActivity.this); 
     alertDialog.setMessage("Card Written Successfully!"); 

     alertDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Intent intent = new Intent(WriteCardActivity.this, MainActivity.class); 
       Bundle b = new Bundle(); 
       b.putBoolean("new_window", true); //sets new window 
       intent.putExtras(b); 
       startActivity(intent); 
      } 
     }); 


     alertDialog.create(); 
     alertDialog.show(); 

     super.onNewIntent(intent); 
    } 
3

您的MainActivity上有IntentFilter,因此Intent应与活动的IntentFilter匹配。

所以,你应该开始你的活动是这样的:

Intent nextActivity = new Intent(WriteCardActivity.this, MainActivity.class); 
nextActivity.setAction(Intent.ACTION_MAIN); 
nextActivity.addCategory(Intent.CATEGORY_LAUNCHER); 

startActivity(nextActivity); 
WriteCardActivity.this.finish(); 
+0

我不明白。你建议我做什么? –

+0

我已更新我的帖子。另请阅读关于意图和意图过滤的内容http://developer.android.com/guide/components/intents-filters.html – Gaskoin

+0

它仍然不起作用 –

1

此代码为我工作。并且不要从MainActivity的onCreate,onResume或onPause调用WriteCardActivity。否则WriteCardActivity将再次开始。

private void formatTag(Tag tag, NdefMessage ndefMessage) 
{ 
    NdefFormatable ndefFormatable = NdefFormatable.get(tag); 

    if (ndefFormatable == null) 
    { 
     Toast.makeText(this, "Tag is not NDEF formatable", Toast.LENGTH_LONG).show(); 
     return; 
    } 

    try 
    { 
     ndefFormatable.connect(); 
     ndefFormatable.format(ndefMessage); 
     ndefFormatable.close(); 
     Toast.makeText(this, "Tag has be written successfully!", Toast.LENGTH_LONG).show(); 

     Intent nextActivity = new Intent(WriteCardActivity.this, MainActivity.class); 
     startActivityForResult(nextActivity, 0); 
     WriteCardActivity.this.finish(); 

    } 
    catch (Exception e) 
    { 
     Log.e("formatTag: ", e.getMessage()); 
    } 


}