onNewIntent永远不会在Activity中调用

时间:2018-04-08 15:50:37

标签: android android-activity fragment nfc onnewintent

关于我在片段和活动中使用onNewIntent方法遇到的不同问题,我已经就SO提出了多个问题。我现在的问题是,无论我做什么,都不会调用Activity中的onNewIntent。具有onNewIntent的Activity包含多个选项卡。我的标签(片段)包含用于书写和阅读NFC标签的代码。

这是活动的代码:

    public class MyAppHome extends AppCompatActivity {

    protected DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mtoggle;
    NfcAdapter nfcAdapter;
    private Toolbar mtoolbar;
    private TextView mName;
    private SectionsPagerAdapter mSectionsPagerAdapter;
    private ViewPager mViewPager;
    private NavigationView mNavigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drawer_layout);

        mtoolbar = (Toolbar) findViewById(R.id.nav_action);
        setSupportActionBar(mtoolbar);
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);

        mNavigationView= (NavigationView)findViewById(R.id.nav_view);
        mDrawerLayout = findViewById(R.id.drawer_layout);
        mtoggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
        mDrawerLayout.addDrawerListener(mtoggle);
        mtoggle.syncState();
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

        mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));

        tabLayout.setupWithViewPager(mViewPager);
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                switch (tab.getPosition())
                {
                    case 0:
                        mViewPager.setCurrentItem(0);
                        mtoolbar.setTitle("Home");
                        break;

                    case 1:
                        mViewPager.setCurrentItem(1);
                        mtoolbar.setTitle("Writer");
                        break;

                    case 2:
                        mViewPager.setCurrentItem(2);
                        mtoolbar.setTitle("Reader");
                        break;

                    case 3:
                        mViewPager.setCurrentItem(3);
                        mtoolbar.setTitle("Others");
                        break;

                    case 4:
                        mViewPager.setCurrentItem(4);
                        mtoolbar.setTitle("Alarm");
                        break;


                    default:
                        mViewPager.setCurrentItem(tab.getPosition());
                        mtoolbar.setTitle("My APP");
                        break;
                }

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

        NavigationView navigationView = findViewById(R.id.nav_view);

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                // set item as selected to persist highlight
                menuItem.setChecked(true);

                switch (menuItem.getItemId()){

                    case R.id.nav_home:
                        mViewPager.setCurrentItem(0);
                        mDrawerLayout.closeDrawers();
                        mtoolbar.setTitle("Home");
                        break;

                    case R.id.nav_writer:
                        mViewPager.setCurrentItem(1);
                        mDrawerLayout.closeDrawers();
                        mtoolbar.setTitle("Writer");
                        break;

                    case R.id.nav_medication:

                        mViewPager.setCurrentItem(2);
                        mDrawerLayout.closeDrawers();
                        mtoolbar.setTitle("Reader");
                        break;

                    case R.id.nav_missedPill:
                        mViewPager.setCurrentItem(3);
                        mDrawerLayout.closeDrawers();
                        mtoolbar.setTitle("Others");
                        break;

                    case R.id.nav_alarm:
                        mViewPager.setCurrentItem(4);
                        mDrawerLayout.closeDrawers();
                        mtoolbar.setTitle("Alarm");
                        break;

                    case R.id.nav_logout:
                        FirebaseAuth.getInstance().signOut();
                        finish();
                        startActivity(new Intent(getApplicationContext(),Login.class));

                }
                // close drawer when item is tapped
                mDrawerLayout.closeDrawers();
                return true;
            }
        });

        mDrawerLayout.addDrawerListener(
                new DrawerLayout.DrawerListener() {
                    @Override
                    public void onDrawerSlide(View drawerView, float slideOffset) {
                        // Respond when the drawer's position changes
                    }

                    @Override
                    public void onDrawerOpened(View drawerView) {
                        // Respond when the drawer is opened
                    }

                    @Override
                    public void onDrawerClosed(View drawerView) {
                        // Respond when the drawer is closed
                    }

                    @Override
                    public void onDrawerStateChanged(int newState) {
                        // Respond when the drawer motion state changes
                    }
                }
        );
               initNFC(getIntent());
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_dosis_home, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
           if(mtoggle.onOptionsItemSelected(item)){
                return true;
            }
            //noinspection SimplifiableIfStatement
            if (item.getItemId()== R.id.action_settings) {
                return true;
               }
            return super.onOptionsItemSelected(item);
                 }

@Override
    public void onResume() {
        super.onResume();

        IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        IntentFilter techDetected = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
        IntentFilter[] nfcIntentFilter = new IntentFilter[]{techDetected,tagDetected,ndefDetected};
        PendingIntent pendingIntent = PendingIntent.getActivity(
                this, 0, new Intent(this.getApplicationContext(), this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        if(nfcAdapter !=null){
            Log.d("W", "nfcadapter is not null");
            nfcAdapter.enableForegroundDispatch(this, pendingIntent, nfcIntentFilter, null);
        }

    }

 @Override
    public void onPause() {
        super.onPause();
        if(nfcAdapter !=null){
            disableForegroundDispatchSystem();
        }

    }
public boolean write2NFC(MyNfcMessage m ) {

        NdefMessage ndefMessage = createNdefMessage(m.key1, m.key2,m.key3);
        writeNdefMessage(tag, ndefMessage);
        return true;
    }

    private void initNFC(Intent intent) {
        if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
            // if (nfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
            //Toast.makeText(getActivity(), "NfcIntent!", Toast.LENGTH_SHORT).show();
            tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        }
    }

  protected void onNewIntent(Intent intent) {

        System.out.print("I am here in Home");
        Log.d("my tag", "I am here now");
        initNFC(intent);
        Log.d("my tag ", "onNewIntent: something ");

}



     private void disableForegroundDispatchSystem() {
                nfcAdapter.disableForegroundDispatch(this);
            }

            private void formatTag(Tag tag, Nde

fMessage ndefMessage) {
            try {

                NdefFormatable ndefFormatable = NdefFormatable.get(tag);

                if (ndefFormatable == null) {
                    Toast.makeText(this, "Tag is not ndef formatable!", Toast.LENGTH_SHORT).show();
                }

                else{
                    ndefFormatable.connect();
                    ndefFormatable.format(ndefMessage);
                    ndefFormatable.close();
                    Toast.makeText(this, "Tag writen!", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                Log.e("formatTag", e.getMessage());
            }

        }

        private void writeNdefMessage(Tag tag, NdefMessage ndefMessage) {

                try {

                    if (tag == null) {
                        Toast.makeText(this, "Tag object cannot be null", Toast.LENGTH_SHORT).show();
                        return;
                }

                Ndef ndef = Ndef.get(tag);

            if (ndef == null) {
                // format tag with the ndef format and writes the message.
                formatTag(tag, ndefMessage);


        } else {
                    ndef.connect();
                    if (!ndef.isWritable()) {
                        Toast.makeText(this, "Tag is not writable!", Toast.LENGTH_SHORT).show();

                        ndef.close();
                        return;
                    }

                    ndef.writeNdefMessage(ndefMessage);
                    ndef.close();

                    Toast.makeText(this, "Tag writen!", Toast.LENGTH_SHORT).show();

                }

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

        }

        private NdefRecord createTextRecord(String content) {
                try {
                    byte[] language;
                    language = Locale.getDefault().getLanguage().getBytes("UTF-8");

                    final byte[] text = content.getBytes("UTF-8");
                    final int languageSize = la

nguage.length;
                final int textLength = text.length;
                final ByteArrayOutputStream payload = new ByteArrayOutputStream(1 + languageSize + textLength);

                payload.write((byte) (languageSize & 0x1F));
                payload.write(language, 0, languageSize);
                payload.write(text, 0, textLength);

                return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], payload.toByteArray());

            } catch (UnsupportedEncodingException e) {
                Log.e("createTextRecord", e.getMessage());
            }
            return null;
        }

         private NdefMessage createNdefMessage(String content, String content2, String content3) {

                NdefRecord ndefRecord = createTextRecord(content);
                NdefRecord ndefRecord2 = createTextRecord(content2);
                NdefRecord ndefRecord3 = createTextRecord(content3);

                NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{ndefRecord, ndefRecord2, ndefRecord3});

                return ndefMessage;
            }

                /**
                 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
             * one of the sections/tabs/pages.
             */
            public class SectionsPagerAdapter extends FragmentPagerAdapter {
                private List<Fragment> mFragments = new ArrayList<>();

                public SectionsPagerAdapter(FragmentManager fm) {
                    super(fm);
                    mFragments.add(new Home());
                    mFragments.add(new Writer());
                    mFragments.add(new Reader());
                    mFragments.add(new Others());
                    mFragments.add(new Alarm());
            }

            @Override
            public Fragment getItem(int position) {
                return mFragments.get(position);
            }

            @Override
            public int getCount() {
                return mFragments.size();
            }

            /*to set text instead of icons*/
            public CharSequence getPageTitle(int position){
                return null;
            }
        }

    }

我的AndroidManifest看起来像这样:

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

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

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

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".FingerPrint"
        android:screenOrientation="portrait" />
    <activity
        android:name=".MyAppHome"

        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustPan">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.nfc.action.TAG_DISCOVERED" />
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <data android:mimeType="text/plain" />
        </intent-filter>

        <meta-data
            android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/nfc_tech_filter" />
    </activity>
    <activity
        android:name=".Login"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.NoActionBar" />
</application>

Home Fragment(tab)用于将信息写入NFC标签:

    public class Home extends Fragment {
    NfcAdapter nfcAdapter;
    Button writebtn;
    Tag tag;
    EditText txtName, txtCountry, txtID;

    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view,savedInstanceState);

    }



      @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            View v= inflater.inflate(R.layout.home, container,false);
             txtName = (EditText)view.findViewById(R.id.pName);
            txtCountry= (EditText)view.findViewById(R.id.pCountry);
            txtID= (EditText)view.findViewById(R.id.pID);
            writebtn=(Button)view.findViewById(R.id.nfcWriteBtn);

writebtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyAppHome homeActivity = (MyAppHome)getActivity();

                MyNfcMessage message = new MyNfcMessage(txtName.getText().toString(), txtCountry.getText().toString(), txtID.getText().toString());
                homeActivity.write2NFC(message);

            }
        });
 return v;

        }

我不明白为什么永远不会调用活动中的onNewIntent(屏幕上没有显示Toast)。它与我的布局有关吗?

更新:通过创建新项目并将旧项目中的所有代码复制到新项目来解决问题。

1 个答案:

答案 0 :(得分:-1)

检查一下:

http://www.helloandroid.com/tutorials/communicating-between-running-activities

在manifest.xml中,在活动标签中设置launchmode =“singleTask”