当前位置: 首页 > 知识库问答 >
问题:

等待的意图总是会产生新的活动

岳安福
2023-03-14

我正在尝试制作具有nfc功能的应用程序。问题是,当nfc标签被发现时,挂起的意图总是会产生一个已经存在的新活动。我用的是tab主机。如何在不进行新活动的情况下制作悬挂帐篷。谢谢。

 public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);        

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

    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(); }

                setIntent(new Intent());
            }
            enableNdefExchangeMode();        
        }   
        private void enableNdefExchangeMode() { mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mNdefExchangeFilters, null); } 

    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;
        }


 public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);        

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

    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(); }

                setIntent(new Intent());
            }
            enableNdefExchangeMode();        
        }   
        private void enableNdefExchangeMode() { mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mNdefExchangeFilters, null); } 

    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;
        }

共有3个答案

燕璞
2023-03-14

创建您的待定意图如下:

PendingIntent.getActivity(this, 0,new Intent(this,
    getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
    |Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
    |Intent.FLAG_ACTIVITY_REORDER_TO_FRONT), 0);
韩寂离
2023-03-14

试试这个:

mNotificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

在你的清单上:

android:launchMode="singleTask"
袁青青
2023-03-14

将您的活动的android:launchMode=“singleTask”放入清单中。这就是诀窍。每当系统发送NFC意图时,总是会创建一个新的活动。这对于NFC来说是独一无二的。因此,设置android:launchMode=“singleTop”将不起作用,在Pending帐篷中设置标志也将不起作用。

另一个解决方案是使用NfcAdapter。在所有活动中启用ForegroundDispatch()。这样,你的应用程序就可以直接处理所有NFC意图(通过onNewIntent())。

 类似资料:
  • 我有个很基本的问题 我正在努力了解Service Worker的生命周期,或者更好地了解实际情况下初始化和更改状态的内容。 我现在有两个问题: 1-在<代码>chrome://inspect/#service-工人始终有2行ou 3行,显示所有服务工人都以相同的PID运行。为什么?为什么不止一个? 2-当我在刷新时检查我的服务人员时,我得到以下信息: #566已激活并正在运行[停止] 这是什么意思

  • 问题内容: 我的两种情况- 1)首先 这使驱动程序有45秒的时间来搜索文本(这是预期的) 2)第二 现在这使驱动程序有 30秒的时间 来搜索文本(不需要) 有没有一种方法可以让selenium仅等待等待时间,而不等待两者中的较大者? 注意-不声明隐式等待时间不是一种选择,因为每次驱动程序无法找到东西时,我都无法让selenium挂起。 使用Selenium版本30,Windows,ff 问题答案:

  • 我目前在活动A中。我收到通知,我想在单击通知时重新创建活动A(完成A,然后再次创建)。意向类似乎没有类似于Pending帐篷的标志。标记取消当前。

  • 使用Appium(用于windows上的android),我需要检查登录场景,输入用户和密码后,点击登录按钮,新(等待)活动打开,1。请指导我如何获得当前活动,即在按下登录按钮之前。2.按下登录按钮后,如何导航到等待活动,以便检查登录是否成功。

  • 我有一个由两个字段“键控”的记录流,然后分配一个间隔为30秒的会话窗口。我使用附加在记录上的“时间戳”作为事件时间。我正在使用“Assign AscendingTimeStamps”水印。 以下面的记录为例。该流由(用户,place)键控。 Record1:user1,place1,timestamp t1 Record2:user2,place1,timestamp在t1之后30秒 桶1 Rec

  • Ubuntu 20 节点12.18。4 npm6.14。6 续集6.3。5. 我遵循官方指南,现在感到很困惑 成功配置Sequelize并连接后,我尝试运行(来自官方文档) 它抛出。 在正式开始页面https://sequelize.org/master/manual/getting-started.html,它清楚地指出: Sequelize提供的大多数方法都是异步的,因此会返回Promises