2012-05-07 2 views
-1

несколько недель назад я уже задавал этот вопрос, но «пока не знаю, что ответа нет. Я не знаю, что не так, но каждый раз, когда я сканирую тэг nfc, всегда создается то же новое действие. как я могу это решить? здесь кодКаждый раз, когда я просматриваю NFC, новая активность создана

public class CheckinActivity extends Activity{ 
private boolean mResumed = false; 
private boolean mWriteMode = false; 
NfcAdapter mNfcAdapter; 
PendingIntent mNfcPendingIntent; 
IntentFilter[] mWriteTagFilters; 
IntentFilter[] mNdefExchangeFilters;      

TabelToko toko;   
TabelAbsen helper; 
Cursor model=null; 
AlmagAdapter adapter=null; 
ListView list; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    TextView viewId = (TextView)findViewById(R.id.idlogin); 
    DigitalClock jam = (DigitalClock)findViewById(R.id.jam); 
    viewId.setVisibility(View.GONE); 
    jam.setVisibility(View.GONE); 

    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);            
    mNfcPendingIntent = PendingIntent.getActivity(this, 0,new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
    toko = new TabelToko(this);    
    toko.insertToko(); 

    getWaktu(); 
    helper = new TabelAbsen(this);   
    list=(ListView)findViewById(R.id.listChek);       
    model=helper.getAll(tanggal); 
    startManagingCursor(model); 
    adapter=new AlmagAdapter(model);  
    list.setAdapter(adapter);   
}    
@Override 
public void onDestroy() { super.onDestroy();  helper.close(); } 
private void cekNfc (String id) throws SQLException, UnsupportedEncodingException, GeneralSecurityException{     
    toko.open();   
    Cursor c = toko.CekToko(id);   
    if (c.moveToFirst()){ 
     getWaktu(); 
     Cursor d = helper.cekAbsen(id, tanggal);        
     if (d.moveToFirst()==false){ 
      //insert checkin 
      helper.insertAbsen(NFCSalesAttendanceActivity.idpegawai, NFCSalesAttendanceActivity.username, 
       id, c.getString(1), c.getString(2), tanggal, jam, "checkin");           
      model.requery(); 
      Toast.makeText(this, "Checkin", Toast.LENGTH_LONG).show(); 
     } 
     else{      
      if (d.getCount()==1){ 
       helper.insertAbsen(NFCSalesAttendanceActivity.idpegawai, NFCSalesAttendanceActivity.username, 
         id, c.getString(1), c.getString(2), tanggal, jam, "checkout");     
        model.requery(); 
        Toast.makeText(this, "Insert Checkout", Toast.LENGTH_LONG).show(); 
      } 
      else{ 
       d.moveToFirst(); d.moveToNext();    
       helper.updateAbsen(NFCSalesAttendanceActivity.idpegawai, NFCSalesAttendanceActivity.username, 
        id, c.getString(1), c.getString(2), tanggal, jam, "checkout",d.getString(0));     
       model.requery(); 
       Toast.makeText(this, "Update Checkout", Toast.LENGTH_LONG).show(); 
      } 
     }     
    } 
    else{ 
     new AlertDialog.Builder(this).setTitle("Perhatian!").setMessage("NFC Tidak Terdaftar di Database!") 
     .setNeutralButton("Tutup", new DialogInterface.OnClickListener() {     
      @Override 
      public void onClick(DialogInterface dialog, int which) { } }).show(); 
    } 
    toko.close();    
} 


@Override  
protected void onResume() {  
    super.onResume(); 
    mResumed = true;    
    // Sticky notes received from Android 
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {    
     NdefMessage[] messages = getNdefMessages(getIntent()); 
     byte[] payload = messages[0].getRecords()[0].getPayload();    
     try          { 
     cekNfc(new String(payload)); } 
     catch (SQLException e)     { e.printStackTrace(); } 
     catch (NoSuchAlgorithmException e)  { e.printStackTrace(); } 
     catch (UnsupportedEncodingException e) { e.printStackTrace(); } 
     catch (GeneralSecurityException e) { 

      e.printStackTrace(); 
     }         
     setIntent(new Intent()); // Consume this intent. 
    } 
    enableNdefExchangeMode();   
} 
private void enableNdefExchangeMode() { mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mNdefExchangeFilters, null); }  

@Override 
protected void onNewIntent(Intent intent) { // NDEF exchange mode    
    if (!mWriteMode && NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { 
     NdefMessage[] msgs = getNdefMessages(intent);    
     byte[] payload = msgs[0].getRecords()[0].getPayload();              
    } 
} 
NdefMessage[] getNdefMessages(Intent intent) { // Parse the intent    
    NdefMessage[] msgs = null;   
    String action = intent.getAction(); 
    //jika ada action 
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {      
     Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
     if (rawMsgs != null) { 
      msgs = new NdefMessage[rawMsgs.length]; 
      for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } 
     } 
    } 
    return msgs; 
} 

class AlmagAdapter extends CursorAdapter { AlmagAdapter(Cursor c) { super(CheckinActivity.this, c); }  
    @Override 
    public void bindView(View row, Context ctxt, Cursor c) {    
     AlmagHolder holder=(AlmagHolder)row.getTag();   
     holder.populateFrom(c, helper);   
    } 

    @Override 
    public View newView(Context ctxt, Cursor c, ViewGroup parent) { 
     LayoutInflater inflater=getLayoutInflater(); 
     View row=inflater.inflate(R.layout.checkin, parent, false); 
     AlmagHolder holder=new AlmagHolder(row);    
     row.setTag(holder);   
     return(row); 
    } 
} 
static class AlmagHolder { 
    private TextView nama=null; 
    private TextView alamat=null; 
    private TextView waktu=null; 
    private ImageView gambar=null; 
    private View row=null; 

    AlmagHolder(View row) { 
     this.row=row;     
     nama=(TextView)row.findViewById(R.id.namatoko); 
     alamat=(TextView)row.findViewById(R.id.alamat); 
     waktu=(TextView)row.findViewById(R.id.waktu); 
     gambar=(ImageView)row.findViewById(R.id.gambar); 
    } 

    void populateFrom(Cursor c, TabelAbsen helper) {    
     nama.setText(helper.getNamaToko(c)); 
     alamat.setText(helper.getAlamatToko(c)); 
     waktu.setText(helper.getWaktu(c)); 
     if (helper.getStatusCheckin(c).equals("checkin"))  { gambar.setImageResource(R.drawable.kanan); } 
     else if (helper.getStatusCheckin(c).equals("checkout")) { gambar.setImageResource(R.drawable.kiri); }   
    } 
} 

}

ответ

1

пытаются установить launchMode в SingleTop

и переопределить onNewIntent()

+0

попытался, ничего не изменилось. – user1326288

+0

здесь экран съемки. это основное приложение http://i.imgur.com/ubCQw.png, и это действие, которое всегда появляется каждый раз, когда я сканирую nfc http://i.imgur.com/iBXcs.png – user1326288

0

Установите режим запуска деятельности в "singleTask" в манифесте , Это должно решить проблему, так как сейчас не может быть более одного экземпляра Activity.

+0

, уже пробовал это, но он не работает , – user1326288

+0

Из скриншотов, которые вы опубликовали, я вижу, что вы используете TabActivity. Таким образом, код операции, который вы указали выше, который задает ForegroundDispatch, запущен внутри TabWidget. Раньше я раньше не сталкивался с этой ситуацией. Не могли бы вы попытаться добавить ForegroundDispatch в TabActivty вместо этого и в onNewIntent() перенаправлять намерение в вашу CheckinActivity? –

+0

это не работает, может быть, другая идея? В любом случае, эта проблема действительно меня раздражает. – user1326288

2

Я столкнулся с той же problème недавно, (кажется, что вы не можете предотвратить ваше приложение от вызова OnDestroy, каждый раз, когда вы касаетесь NFC-метку.) -> Edit ...

Так у вас есть чтобы сохранить все в SharedPreferences или любые другие Stroage.

В onCreate вы можете перезагрузить свои данные, чтобы даже новая активность получила всю необходимую информацию.

Edit:

Через некоторое время тестирования, то SingleTask сделал работу для меня. Я поместил все, что нужно было повторно инициализировать в метод onStart().

Дополнительно я поставил логику с onResume() на onNewIntent(), где я сразу поймаю намерение.

Но я все еще сохраняю все для будущего использования: D.

Смежные вопросы