Niat kliring

111

Aplikasi Android saya dipanggil oleh maksud yang meneruskan informasi (pendingintent di statusbar).

Ketika saya menekan tombol beranda dan membuka kembali aplikasi saya dengan menahan tombol beranda, itu memanggil maksud lagi dan ekstra yang sama masih ada.

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
      super.onSaveInstanceState(savedInstanceState);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
    }

ini adalah kode yang tidak berjalan seperti yang seharusnya

    String imgUrl;
    Bundle extras = this.getIntent().getExtras();


    if(extras != null){
        imgUrl = extras.getString("imgUrl");
        if( !imgUrl.equals(textView01.getText().toString()) ){

            imageView.setImageDrawable( getImageFromUrl( imgUrl ) );
            layout1.setVisibility(0);
            textView01.setText(imgUrl);//textview to hold the url

        }

    }

Dan maksud saya:

public void showNotification(String ticker, String title, String message, 
    String imgUrl){
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = 
        (NotificationManager) getSystemService(ns);
    int icon = R.drawable.icon;        // icon from resources
    long when = System.currentTimeMillis();         // notification time
    CharSequence tickerText = ticker;              // ticker-text

    //make intent
    Intent notificationIntent = new Intent(this, activity.class);
    notificationIntent.putExtra("imgUrl", imgUrl);
    notificationIntent.setFlags(
        PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);
    PendingIntent contentIntent = 
        PendingIntent.getActivity(this, 0, 
        notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);

    //make notification
    Notification notification = new Notification(icon, tickerText, when);
    notification.setLatestEventInfo(this, title, message, contentIntent);
    //flags
    notification.flags = Notification.FLAG_SHOW_LIGHTS | 
        Notification.FLAG_ONGOING_EVENT | 
        Notification.FLAG_ONLY_ALERT_ONCE | 
        Notification.FLAG_AUTO_CANCEL;
    //sounds
    notification.defaults |= Notification.DEFAULT_SOUND;
    //notify
    mNotificationManager.notify(1, notification);
}

Adakah cara untuk menghapus maksud atau memeriksa apakah sudah digunakan sebelumnya?

Mars
sumber
Bisakah Anda memposting kode Anda?
xandy
Saya menambahkan kode ke pertanyaan saya
Mars
Daripada menghapus Intent, Anda bisa menentukan jenis peluncuran dan menangani aliran aplikasi yang sesuai. Dapatkan Ekstra hanya jika diluncurkan untuk pemberitahuan dan bukan dari latar belakang. stackoverflow.com/questions/4116110/clearing-intent/…
BB

Jawaban:

168

MEMPERBARUI:

Saya tidak menyadari bahwa jawaban ini akan begitu banyak dirujuk ketika saya pertama kali menulisnya lebih dari 5 tahun yang lalu!

Saya akan menjelaskan untuk menunjukkan bahwa sesuai dengan jawaban @ tato-rodrigo ini tidak akan membantu Anda mendeteksi maksud yang sudah ditangani dalam beberapa situasi.

Saya juga harus menunjukkan bahwa saya meletakkan "jelas" dalam tanda kutip karena suatu alasan - Anda tidak benar - benar membersihkan maksud dengan melakukan ini, Anda hanya menggunakan penghapusan ekstra sebagai tanda bahwa maksud ini telah dilihat oleh aktivitas .


Saya memiliki masalah yang persis sama.

Jawaban di atas menempatkan saya di jalur yang benar dan saya menemukan solusi yang lebih sederhana, gunakan:

getIntent().removeExtra("key"); 

pemanggilan metode untuk "menghapus" Intent.

Agak terlambat menjawab karena ini ditanyakan setahun yang lalu, tapi semoga ini membantu orang lain di masa depan.

Maks
sumber
4
bukankah metode removeExtra () mengambil parameter String? seperti ini getIntent (). removeExtra ("String");
tony9099
25
@Maks Saya mungkin salah tetapi saya pikir ini tidak akan berfungsi dalam skenario berikut: 1) Buka aktivitas melalui notifikasi; 2) Selesaikan aktivitas dengan menekan tombol kembali; 3) Buka kembali aktivitas melalui History (Aplikasi Terbaru). Kasus lainnya adalah ketika sistem mematikan aplikasi karena kurangnya sumber daya (aktifkan "Jangan simpan aktivitas" di bawah opsi pengembang dan setelah itu cukup tekan beranda lalu buka aktivitas lagi dari Riwayat). Saya memposting solusi yang saya gunakan di bawah ini. Jika Anda bisa mengomentari ini akan menyenangkan.
tato.rodrigo
2
Sayangnya itu tidak berhasil untuk kami. Kami menemukan bahwa memulai aktivitas baru yang pada gilirannya memulai aktivitas awal menyebabkan OnNewIntent diaktifkan lagi dengan maksud yang sama.
Le-roy Staines
2
Daripada menghapus Intent, Anda bisa menentukan jenis peluncuran dan menangani aliran aplikasi yang sesuai. Dapatkan Ekstra hanya jika diluncurkan untuk pemberitahuan dan bukan dari latar belakang. stackoverflow.com/questions/4116110/clearing-intent/…
BB
2
Tidak berhasil untuk saya. Saya menghadapi masalah yang sama dengan @ tato.rodrigo menyebutkan di mana niat tidak dihapus jika aktivitas dibuka melalui notifikasi atau dari riwayat atau alasan lain yang dia sebutkan, jadi yang saya lakukan setelah mengonsumsi informasi maksud adalah mengatur ulang niat seperti ini setIntent(new Intent())dan bekerja dengan baik sekarang.
Shubhral
43

EDIT: Saya mengedit untuk memposting solusi lengkap yang saya gunakan.

Solusi ini akan berfungsi jika masalahnya adalah "Tidak menjalankan beberapa kode saat aktivitas dimulai dari Riwayat (Aplikasi Terbaru)" .

Pertama-tama, nyatakan a booleandi Anda Activityuntuk menunjukkan jika Intentsudah digunakan:

    private boolean consumedIntent;

Kemudian, simpan dan pulihkan nilai ini dengan aman menggunakan metode onSaveInstanceStatedan onCreateuntuk menangani perubahan konfigurasi dan kasus yang dapat mematikan sistem Activitysaat Anda beralih ke latar belakang.

    private final String SAVED_INSTANCE_STATE_CONSUMED_INTENT = "SAVED_INSTANCE_STATE_CONSUMED_INTENT";

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(SAVED_INSTANCE_STATE_CONSUMED_INTENT, consumedIntent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //set content view ...

        if( savedInstanceState != null ) {
            consumedIntent = savedInstanceState.getBoolean(SAVED_INSTANCE_STATE_CONSUMED_INTENT);
        }

        //other initializations
    }

Sekarang, periksa apakah Anda dapat menjalankan kode Anda di bawah onResumemetode.

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

        //check if this intent should run your code
        //for example, check the Intent action
        boolean shouldThisIntentTriggerMyCode = [...];
        Intent intent = getIntent();
        boolean launchedFromHistory = intent != null ? (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0 : false;
        if( !launchedFromHistory && shouldThisIntentTriggerMyCode && !consumedIntent ) {
            consumedIntent = true;
            //execute the code that should be executed if the activity was not launched from history
        }
    }

Selain itu, jika Anda Activitydikonfigurasi ke singleTop, Anda harus mengatur ulang bendera Anda ketika yang baru Intentdikirim.

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        consumedIntent = false;
    }
tato.rodrigo
sumber
12
Terima kasih banyak! Saya telah membantu kode ini (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)jadi sekarang saya bisa mengetahui kapan dimulainya aktivitas dari sejarah dan saya bisa mengabaikan ekstra saya.
Roman Nazarevych
1
@Lemberg Saya memiliki masalah yang sama, dan saya telah menyelesaikannya sama seperti Anda, Jika Anda menggunakan beberapa tambahan yang berasal dari pemberitahuan push, ada risiko untuk memulai aktivitas Anda dari riwayat dan sering kali menggunakan ekstra Anda dan mengalihkan ke tindakan yang sama seperti Anda pemberitahuan push. Bendera yang diluncurkanFromHistory dapat membantu Anda mengetahui hal ini
Stoycho Andreev
apakah ini akan berfungsi meskipun aktivitas dimusnahkan dan kami membukanya kembali dari tumpukan riwayat?
pengguna25
Bagus! tampaknya berfungsi bahkan jika aplikasi dihancurkan ... tapi tolong @ tato.rodrigo hapus boolean shouldThisIntentTriggerMyCode = [...];dari jawaban (untuk apa?)
pengguna25
Dalam kasus saya dengan multi-pemberitahuan untuk pengguna tertentu itu pengguna yang lebih baik consumedIntentsebagai Stringmengandung pemberitahuan Uid. Uid ini dapat dengan mudah ditambahkan ke notifikasi di backend sebagai stempel waktu saat ini. Anda juga harus menyimpan Uid ini onSaveInstanceStatehanya jika Intent telah datang onCreate. Ini berarti Anda tidak boleh menyimpan Uid dari onNewIntent.
Konstantin Konopko
22

Jawaban maksimal berfungsi untuk membersihkan ekstra:

    getIntent().removeExtra("key"); 

Perintah berguna lainnya adalah:

    getIntent().setAction("");

Anda juga bisa menandai maksud dengan memanggil:

    getIntent().putExtra("used", true);

dan kemudian periksa nilainya.

Slynk
sumber
21

Saat kami meluncurkan aplikasi Android dari Riwayat (Aplikasi Terkini), aplikasi tersebut dapat diluncurkan dengan tiga tanda Maksud yang berbeda.

  1. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    Ini adalah saat aktivitas diluncurkan dari riwayat aplikasi yang diminimalkan (tekan lama tombol home).
    Nilai Konstan: 1048576 (0x00100000)
  2. FLAG_ACTIVITY_NEW_TASK
    Ini adalah saat aktivitas diluncurkan melalui "ikon aplikasi mengklik" atau melalui " Filter maksud ". Di sini aktivitas akan menjadi awal tugas baru di tumpukan riwayat ini.
    Nilai Konstanta: 268435456 (0x10000000)
  3. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | FLAG_ACTIVITY_NEW_TASK
    Ini adalah saat aplikasi ditutup dengan menekan tombol kembali dan kemudian melanjutkan dari Riwayat (aplikasi terbaru).
    Nilai Konstanta: 269484032 (0x10100000)

Nilai konstanta dapat diambil melalui getIntent().getFlags()

Dalam kasus ketiga, Android memuat ulang nilai Intent terakhir dari memorinya. Jadi maksud aplikasi Anda ( getIntent) akan memiliki nilai dari maksud terakhir yang meluncurkan aplikasi.

Sebenarnya, aplikasi harus berperilaku seolah-olah itu adalah peluncuran baru, dengan nilai maksud untuk peluncuran baru, bukan nilai maksud dari peluncuran sebelumnya. Perilaku ini bisa dilihat jika Anda meluncurkan aplikasi dengan mengklik ikon aplikasi, nilai maksud lama tidak akan pernah ada. Ini karena, Android menggunakan filter maksud berikut untuk skenario ini

 <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER"/>
 </intent-filter>

Namun dalam kasus ketiga (Aplikasi yang ditutup, diluncurkan dari Riwayat aplikasi Terbaru), OS Android menggunakan maksud terakhir yang meluncurkan aplikasi sebelum ditutup (dengan menekan tombol kembali). Jadi, Anda akhirnya memiliki nilai maksud lama dan aliran aplikasi tidak tepat.

Menghapus niat adalah salah satu cara untuk menyelesaikannya, tetapi itu tidak akan menyelesaikan masalah sepenuhnya! Saat OS Android memuat ulang Intent dari peluncuran terakhir aplikasi, dan bukan instance terakhir dari maksud peluncuran.

Cara yang tepat untuk menghindari hal ini terjadi, adalah menanganinya dengan mendapatkan jenis Intent untuk menentukan jenis peluncuran.

Jadi dalam LaunchActivity Anda (The salah satu yang memiliki filter maksud didefinisikan dalam manifest), Anda bisa menggunakan kode berikut dalam onCreate(), onStart()atau onResume()metode.

if(getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)) {
    //app is launched from recent apps after it was closed
        normalLaunch();
    } else {
        String intentAction = getIntent().getAction();
        String scheme = getIntent().getScheme();
        //app is launched via other means
        // URL intent scheme, Intent action etc
        if("https".equalsIgnoreCase(scheme)) {
            // URL intent for browser
        } else if("com.example.bb".equalsIgnoreCase(intentAction)) {
            // App launched via package name
        } else {
            // App was launched via Click on App Icon, or other means
            normalLaunch();
        }
    }

Saya kira normalLaunch(), sebaiknya tidak menggunakan parameter dari Intent; jika tidak, Anda perlu memisahkan dan mengoptimalkan metode peluncuran default untuk tidak menggunakan parameter Intent.

BB
sumber
1
Tidak semua pahlawan memakai topi!
Sdghasemi
Saya tidak tahu tetapi selalu mengembalikan nilai true getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYtidak masalah jika saya memulai aktivitas dari aktivitas lain (metode startActivity) atau membukanya kembali dari tumpukan Riwayat (aplikasi terbaru).
pengguna25
Anda harus menggunakannya dalam kombinasi dengan bendera lain, mungkin FLAG_ACTIVITY_NEW_TASK
BB
1
Ini tidak berfungsi saat aktivitas dimatikan di latar belakang karena pengaturan Dev "Jangan simpan aktivitas". Dalam hal ini getIntent () getFlags () identik dengan saat aktivitas dimulai untuk pertama kalinya.
Malachiasz
menghargai penjelasannya tetapi tidak seperti yang dimaksudkan
Azlan Jamal
18

Menghapus objek maksud :

intent.replaceExtras(new Bundle());
intent.setAction("");
intent.setData(null);
intent.setFlags(0);
Mickey Tin
sumber
2
Ini harus menjadi jawaban yang diterima. Bekerja dengan sangat baik!
Martin Erlic
2
Tidak berfungsi saat "jangan simpan aktivitas" dicentang pada opsi pengembang
Jemshit Iskenderov
8

Jawaban singkatnya adalah Tidak mungkin

Jawaban panjang. Tidak ada yang namanya niat "sekali tembak". Dari percobaan diketahui bahwa riwayat aktivitas terkini di Android modern tidak lebih dari "Riwayat maksud". Maksud terbaru yang diteruskan ke aktivitas hanya masuk ke sistem dan itulah kesepakatannya. Orang-orang di atas menyarankan untuk menggunakan

setAction("")

Tapi itu tidak berfungsi karena maksud sudah dicatat sampai Anda mendapatkannya di dalam metode onNewIntent () atau onStart ().

Saya memecahkan masalah dengan menghindari penggunaan maksud. Masalah saya mirip dengan yang diposting oleh penulis. Saya mencoba menerapkan Global Exit dari aplikasi melalui kontrol di area notifikasi. Ini harus menghentikan layanan yang mendasari dan menutup semua aktivitas aplikasi. Anda dapat menemukan perilaku yang sama di aplikasi Waze.

Algoritma:

  1. Buat PendingIntent untuk kontrol notifikasi yang meneruskan tindakan "Keluar" ke aktivitas. Tetapi untuk aktivitas khusus yang merupakan proxy sederhana.
  2. Kode onStart () aktivitas proxy mengurai maksud, memeriksa tindakan, dan menyetel status beberapa model ke "Keluar".
  3. Kode onStart () aktivitas proxy menghapus maksud asli menggunakan setIntent ("") lalu meneruskannya ke aktivitas "Root" tujuan dengan memanggil startActivity (maksud).
  4. Aktivitas proxy onStart () memanggil kode finish ().
  5. Di dalam onStart () dan onNewIntent () dari aktivitas tujuan, periksa status model dan panggil finish () jika "Keluar" (dan juga panggil stopService () dalam kasus saya).

Saya berharap ini akan membantu seseorang karena saya tidak menemukan jawabannya di internet.

Eugene Wechsler
sumber
Saya menemukan ini jawaban yang paling akurat, karena "membersihkan maksud" tidak selalu berarti "menghapus ekstra tertentu". Saya juga tidak berpikir ada cara mudah untuk melakukan itu.
mdelolmo
5

Pastikan bahwa Anda menggunakan PendingIntent.FLAG_UPDATE_CURRENT bendera untuk PendingIntent .

PendingIntent pendingIntent = PendingIntent.getActivity(this, 100, mPutIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Dimana mPutIntentmilikmu Intent.

Semoga ini bisa membantu Anda.

Hiren Patel
sumber
1
menyelamatkan hidupku !!
eren130
1
Saya tidak mengerti bagaimana ini bukan jawaban yang diterima. Satu-satunya penyesalan saya hanyalah satu: memiliki satu suara positif. Bersulang.
Andy
2

Saya baru-baru ini mengalami masalah ini dan saya menyelesaikannya dengan menambahkan stempel waktu sebagai parameter tambahan ke maksud:

private void launchActivity(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.putExtra("KEY_EXTRA_TIMESTAMP", System.currentTimeMillis());
    context.startActivity(intent);
}

Setelah itu, simpan stempel waktu ke preferensi bersama:

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

    long time = getIntent().getLongExtra("KEY_EXTRA_TIMESTAMP", -1);
    long previousTime = getPreferences(MODE_PRIVATE).getLong("timestamp", -1);

    //ignore if the timestamp is the same as the previous one  
    if (time != previousTime) {
        handleIntent(getIntent());
        if (time != -1) {
            //save the timestamp
            getPreferences(MODE_PRIVATE).edit().putLong("timestamp", time).apply();
        }
    }
}
Antonio Martínez Guerola
sumber
1

Saya punya masalah yang persis sama. Solusi saya adalah menambahkan booleanvariabel yang diatur kapan Intent'digunakan' dan ifpernyataan berdasarkan ini booleanuntuk memeriksa apakah Anda harus menggunakan Intentatau tidak.

piksel
sumber
3
ini mungkin tidak berfungsi, karena nilai boolean akan dibuat ulang (jika dideklarasikan global dalam activty) saat aktivitas dihentikan dan kemudian dimulai ulang. (mengklik tombol beranda misalnya)
tony9099
1

Saat Anda selesai memproses Intent, lakukan ini:

setIntent(null);

Anda tidak akan melihat Intent yang telah diproses itu lagi, dan Anda tidak akan menutupi masalah dengan mengedit konten Intent yang telah diproses.

straya
sumber
1

Saya tidak dapat menemukan cara untuk menghapus Intent Extra . Tidak ada jawaban tentang penghapusan ekstra dari maksud yang berfungsi jika Anda mengaktifkan "Jangan Simpan Aktivitas " dari Opsi Pengembang (Dengan begitu, Anda dapat menghancurkan Aktivitas dan kembali untuk menguji apakah Ekstra masih ada).

Sebagai solusi untuk masalah ini, saya menyimpan nilai boolean di SharedPreferences setelah Intent Extras diproses. Ketika Intent yang sama dikirim ulang ke Activity, saya memeriksa nilai SharedPreference dan memutuskan untuk memproses Intent Extra. Jika Anda mengirim Intent Extra baru lagi ke Aktivitas yang sama, Anda membuat nilai SharedPreference menjadi false dan Aktivitas akan memprosesnya. Contoh :

// Start Activity with Intent Extras
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra("someData", "my Data");
// Set data as not processed
context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).edit().putBoolean("myActivityExtraProccessed", false).commit();
context.startActivity(intent);

...

public class MyActivity{

    ...
    public void someMethod(){
        boolean isExtrasProcessed = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).getBoolean("myActivityExtraProccessed", false);  
         if (!isExtrasProcessed) {
              // Use Extras

              //Set data as processed
              context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).edit().putBoolean("myActivityExtraProccessed", true).commit();
         }
    }

}
Jemshit Iskenderov
sumber
preferensi tidak masuk akal karena Anda tidak tahu apakah Anda memulai aktivitas menggunakan startActivity atau Anda membukanya kembali dari History Stack ...
pengguna25
@ user25 saya rasa ada cara untuk mendeteksi apakah itu diluncurkan dari aplikasi terbaru. Tapi apakah itu penting, maksud ekstra dikonsumsi atau tidak, jika dikonsumsi Anda mengetahuinya dari pref yang dibagikan. Saya telah menggunakan ini untuk mengkonsumsi pemberitahuan push ekstra dan tidak peduli bagaimana aktivitas dibuka untuk kasus saya.
Jemshit Iskenderov
0

Bahkan setelah secara manual menghapus ekstra Intent dan Intent setelah mereka diurai, tampaknya Activity.getIntent () akan selalu mengembalikan Intent asli yang memulai Activity.

Untuk menyiasati ini, saya merekomendasikan sesuatu seperti ini:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // The Intent provided by getIntent() (and its extras) will persist through a restore
    // via savedInstance.  Because of this, restoring this activity from a
    // an instance that was originally started with extras (deep-link or 
    // pre-defined destination) may cause un-desired behavior
    // (ie...infinite loop of sending the user directly to somewhere else because of a
    // pre-defined alternate destination in the Intent's extras).
    //
    // To get around this, if restoring from savedInstanceState, we explicitly
    // set a new Intent *** to override the original Intent that started the activity.***
    // Note...it is still possible to re-use the original Intent values...simply
    // set them in the savedInstanceState Bundle in onSavedInstanceState.
    if (savedInstanceState != null) {
        // Place savedInstanceState Bundle as the Intent "extras"
        setIntent(new Intent().putExtras(savedInstanceState));
    }

    processIntent(getIntent())
}

private void processIntent(Intent intent) {
    if (getIntent().getExtras() == null) {
        // Protection condition
        return;
    }

    doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST"));

    final String somethingIDontWantToPersist = 
        intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST");

    if(somethingIDontWantToPersist != null) {
        doSomething(somethingIDontWantToPersist);
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save selective extras from original Intent...
    savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued");
    super.onSaveInstanceState(savedInstanceState);
}

Dengan cara ini, terdapat mekanisme untuk membuang Intent asli sambil tetap mempertahankan kemampuan untuk secara eksplisit mempertahankan bagian tertentu dari ekstra Intent / Intent asli.

Perhatikan bahwa saya belum menguji semua mode peluncuran Aktivitas.

dell116
sumber
0

Cara langsungnya adalah menghindari pemanggilan getIntent () dari metode selain onCreate (). Tetapi ini akan menyebabkan masalah selama peluncuran berikutnya jika pengguna meninggalkan Aktivitas kami dengan mengetuk tombol Beranda. Saya pikir masalah ini tidak memiliki solusi yang berfungsi penuh.

mifthi
sumber
0

Saya menghadapi masalah yang sama dan mencoba menggunakan metode di atas tetapi tidak berhasil.

Saya rasa itu mungkin karena mode peluncuran aktivitas yang saya gunakan mode singleTop.

Ketika saya melatarbelakangi aplikasi dan menggunakan RamEater untuk mensimulasikan masalah, maksud itu selalu memiliki ekstra bahkan saya menyetelnya nol atau menghapus kunci.

Masalahnya hilang dengan menggunakan penyimpanan preferensi di Android untuk memeriksa yang telah lewat.

Thanawat Masileerungsri
sumber
0

Ini bukan praktik yang baik untuk menambahkan ekstra hanya untuk mengetahui apakah ekstra telah dikonsumsi atau tidak, mengapa tidak melakukan ini ?:

if (intent.hasExtra(EXTRA_NAME) && intent.getBooleanExtra(EXTRA_NAME, false)) {
    // consume extra here after that set it to false
    putExtra(EXTRA_NAME, false)
}   
Gilbert Parreno
sumber
-1

Bagaimana dengan ini? Setel newIntent sebagai maksud.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
coolcool1994
sumber
1
Saya tidak berpikir itu berhasil. Saat aktivitas dibuat ulang dari riwayat, maksudnya tetap tidak terpengaruh.
mdelolmo
-1

Bagaimana jika Anda ingin menghapus maksud - menggantinya dengan yang kosong?

misalnya.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

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

    Intent theIntent = getIntent();
    if ("myaction".equals(theIntent.getAction()) {
         handleIntent();
         onNewIntent(new Intent());  // <--- "clear" the intent by setting empty one
    }
}
Iftah
sumber
-1

Semoga ini bisa membantu semua orang. Jadi pertama kita mendapatkan maksudnya

//globally
Intent myIntent;

Tempatkan ini di suatu tempat di onCreate

myIntent = getIntent();
String data = myIntent.getStringExtra("yourdata");
//Your process here

Sekarang mari kita atur ini sehingga setiap kali aplikasi kita dihancurkan atau keluar kita akan menghapus data

@Override
protected void onDestroy() {
    //TODO: Clear intents
    super.onDestroy();
    myIntent.removeExtra("data");
}
@Override
protected void onBackPressed() {
    //TODO: Clear intents
    super.onBackPressed();
    myIntent.removeExtra("data");
}

Anda mendapatkan idenya, jika ini tidak cukup temukan lebih banyak panggilan balik 'on'

Pixeldroid Modding
sumber
Maksudnya dihapus hanya saat Anda keluar dari aplikasi, mis. Menggesek yang terbaru.
Pixeldroid Modding
-2

Meskipun Intent.removeExtra("key")akan menghapus satu kunci tertentu dari ekstra, ada juga metode Intent.replaceExtras (Bundle) , yang dapat digunakan untuk menghapus seluruh ekstra dari Intent, jika nullditeruskan sebagai parameter.

Dari dokumen:

Gantikan sepenuhnya ekstra di Intent dengan Bundel ekstra yang diberikan.

Parameters
extras Kumpulan ekstra baru di Intent, atau null untuk menghapus semua ekstra.

Karena metode putXXX () menginisialisasi ekstra dengan Bundle baru jika null, ini bukan masalah.

Steve Benett
sumber
-3
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addCategory(Intent.CATEGORY_HOME);  
startActivity(intent);
Ramkumar
sumber
2
Anda harus mempertimbangkan untuk menguraikan jawaban Anda dengan memberikan beberapa detail tentang apa yang Anda lakukan dan bagaimana jawaban itu menjawab pertanyaan OP.
forsvarir
1
@Ramkumar ini membawa pengguna ke rumah. Yang jelas hanya satu kasus dari 10.000 kasus yang dapat menyebabkan onPause, onStop, atau onDestroy dipanggil.
tony9099
Ini bahkan tidak terkait jauh dengan pertanyaan
Hossein Shahdoost