Android uygulamasındaki Etkinlikler arasında nasıl veri aktarırım?


1348

Bir giriş sayfası üzerinden giriş yaptıktan sonra buttonher birinde bir çıkış olacak bir senaryo var activity.

Tıklandığında sign-out, session idoturumu kapatmak için oturum açan kullanıcının yanından geçeceğim . Herkes bana nasıl session iderişilebilir tutulacağı konusunda rehberlik edebilir activitiesmi?

Bu davaya herhangi bir alternatif


14
i sharedpreference kullanılan onun hatırlıyorum şifre özelliği, oturum açma bilgilerini tutmak için de yararlıdır
Shareef'ten

Bu benim için çalışıyor. stackoverflow.com/a/7325248/2125322 Teşekkürler Darshan Computing
matasoy


bu gibi durumlarda commomUtils sınıfını paylaşımlıprefereces yöntemiyle yapmayı deneyin ... bu, kodu temiz ve ilgili verileri bir yerde tutacaktır. Ayrıca, varsayılan uygulama verilerinin herhangi birini temizlemeden, belirli tercihleri ​​temizlemenin tek bir yöntemiyle belirli bir veri kümesini kolayca temizleyebileceksiniz ...
Muahmmad Tayyib

Yanıtlar:


1265

Bunu yapmanın en kolay yolu, oturum kimliğini etkinliği Intentbaşlatmak için kullandığınız oturum açma etkinliğine geçirmektir :

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

Bir sonraki etkinlikle ilgili amaca erişin:

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

Docs Intents için daha fazla bilgi ( "Ekstralar" başlıklı bölümde bakmak) sahiptir.


Eğer başarılı oturum açma etkinliğini imza oturum oturum kimliği geçmek ve bu imza için herhangi bir etkinlik sayfasında çalışacak mı yoksa manuel olarak ben her etkinliğe değer atamak zorunda kalacak ??? yukarıdaki prosedürü kullanarak ??
UMAR

5
Evet, oturum kimliğini, kullanıcının oturumu kapatmasına izin vermek istediğiniz her etkinlik için kullanılabilir hale getirmeniz gerekir. Alternatif olarak, bunu Uygulama nesnesinde saklayabilirsiniz, ancak daha sonra oturumun durumunu yönetmeniz gerekir (kullanmadan önce geçerli olup olmadığını kontrol edin, vb.).
Erich Douglass

1
Lütfen belgelerin aşağıdakileri gösterdiğine dikkat edin: Amaca genişletilmiş veriler ekleyin. Ad bir paket öneki içermelidir; örneğin, com.android.contacts uygulaması "com.android.contacts.ShowAll" gibi adları kullanır.
Serguei Fedorov

1
Ve diğer Etkinlik kullanımından verileri okumak içinLong session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
Farid

1
Verileri kullanarak verileri nasıl aktarabiliriz setDatave bu iki yaklaşım arasındaki fark nedir? Hangisi daha iyi?
Hosein Aqajani

1402

Mevcut Etkinliğinizde yeni bir tane oluşturun Intent:

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

Ardından yeni Etkinlik'te şu değerleri alın:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

Değişkenleri bir Faaliyetten diğerine geçirmek için bu tekniği kullanın.


58
Benim gibi çok kör olanlar için sadece bir bilgi: mevcut etkinliğinize bir tamsayı koyarsanız, bunu yeni olana sokmanız gerekir extras.getInt("new_variable_name"). Eğer getString()android üzerinden almaya çalışın bakın bir int verildi ve null döndürür bakın!
Bish

4
etkinlik zaten çalışıyorsa, yapılması gerekenler var startActivity(i);mı? Ben yapabilir demek etkinlik A çağrı etkinliği B ve o döner veri etkinlik A ? kafam karıştı mı?
Francisco Corrales Morales


String değişkenini tercih ederim. Bir dizeyi istediğiniz zaman tamsayıya veya kayan noktaya dönüştürebilirsiniz.
user914425

140

Erich'in de belirttiği gibi Intent ekstralarını geçmek iyi bir yaklaşım.

Uygulama nesnesi olsa başka bir yol olduğunu ve (/ get her yerde koymak zorunda aksine) birden çok etkinlikte aynı durumda uğraşırken bazen daha kolaydır, ya ilkel ve Strings daha karmaşık nesneleri.

Uygulamayı genişletebilir ve sonra istediğinizi ayarlayabilir / alabilir ve getApplication () ile herhangi bir Etkinlikten (aynı uygulamada) erişebilirsiniz .

Statik gibi görebileceğiniz diğer yaklaşımların da sorun yaratabileceğini, çünkü bellek sızıntılarına neden olabileceğini unutmayın . Uygulama da bunu çözmeye yardımcı olur.


8
Statik problem için +1. muhtemelen temizleme tek birtonun onCreate / onTerminate yöntemi Application sınıfıyla birleştirilmesiyle çözülebilir.
Syd

10
Hey, bu iş parçacığının bir süre önce geri döndüğünü biliyorum, ancak sağlanan bağlantı artık bir çıkmaz nokta. Örneği bulabileceğim bir yer var mı?
JuiCe

Uygulamayı kullanarak bunu nasıl başarabilirim? @CharlieCollins
Banee Ishaque K

İşte bunun güncellenmiş bir örneği, çok eski bir kitaptan :) github.com/charlieCollins/android-in-practice/blob/master/ch07/…
Charlie Collins

@JuiCe Bellek sızıntılarındaki Android Geliştiricileri blog yazısı artık geçersiz.
Edric

94

Kaynak sınıfı:

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)

Hedef Sınıf (NewActivity sınıfı):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    Intent intent = getIntent();

    String fName = intent.getStringExtra("firstName");
    String lName = intent.getStringExtra("lastName");
}

3
Amaç hiç boş olabilir mi? Boş olmadığını kontrol etmeli miyiz?
Micro


85

Sadece niyetini ararken ekstralar göndermelisin.

Bunun gibi:

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

Şimdi OnCreateyönteminizde SecondActivityböyle ekstraları getirebilirsiniz.

Gönderdiğiniz değer şuysalong :

long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));

Gönderdiğiniz değer birString :

String value = getIntent().getStringExtra("Variable name which you sent as an extra");

Gönderdiğiniz değer birBoolean :

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);

3
Lütfen belgelerin aşağıdakileri gösterdiğine dikkat edin: Amaca genişletilmiş veriler ekleyin. Ad bir paket öneki içermelidir; örneğin, com.android.contacts uygulaması "com.android.contacts.ShowAll" gibi adları kullanır.
Serguei Fedorov

Bu, bu cevaptan 2 yıl önce orada bulunan en çok oy alan cevabın ve Sahil Mahajan Mj'nin 1 yaşından büyük olan cevabının bir kopyasıdır . Tek fark: Bir yorum değil, IMO'ya bir cevap değerinde olan örnekler booleanve longalıcılar.
Murmel

48

Olayları bağlam içinde görmeme yardımcı oluyor. İşte iki örnek.

Verileri İletme

resim açıklamasını buraya girin

Ana aktivite

  • Göndermek istediğiniz verileri anahtar / değer çiftiyle bir Amaç'a yerleştirin. Anahtarın kurallarını adlandırma için bu cevaba bakınız .
  • İkinci Etkinliği ile başlatın startActivity.

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // get the text to pass
        EditText editText = (EditText) findViewById(R.id.editText);
        String textToPass = editText.getText().toString();

        // start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra(Intent.EXTRA_TEXT, textToPass);
        startActivity(intent);
    }
}

İkinci Etkinlik

  • Sen kullanmak getIntent()için Intentikinci başlamış olması. Ardından, verileri getExtras()ve ilk etkinlikte tanımladığınız anahtarı ayıklayabilirsiniz . Verilerimiz bir String olduğundan, getStringExtraburada kullanacağız .

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

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

        // get the text from MainActivity
        Intent intent = getIntent();
        String text = intent.getStringExtra(Intent.EXTRA_TEXT);

        // use the text in a TextView
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(text);
    }
}

Verilerin Geri Verilmesi

resim açıklamasını buraya girin

Ana aktivite

  • startActivityForResultRasgele bir sonuç kodu vererek İkinci Etkinliği ile başlatın.
  • Geçersiz Kıl onActivityResult . Bu, İkinci Etkinlik bittiğinde çağrılır. Sonuç kodunu kontrol ederek bunun aslında İkinci Etkinlik olduğundan emin olabilirsiniz. (Bu, aynı ana etkinlikten birden fazla farklı etkinliğe başlarken kullanışlıdır.)
  • İadeden aldığınız verileri çıkarın Intent. Veriler bir anahtar / değer çifti kullanılarak çıkarılır. Anahtar için herhangi bir dize kullanabilirsiniz ama Intent.EXTRA_TEXTmetin gönderdiğim için önceden tanımlanmış kullanacağım .

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra(Intent.EXTRA_TEXT);

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

İkinci Etkinlik

  • Önceki etkinliğe geri göndermek istediğiniz verileri bir Intent. Veriler Intentbir anahtar / değer çifti kullanılarak saklanır . Intent.EXTRA_TEXTAnahtarım için kullanmayı seçtim .
  • Sonucu ayarlayın ve RESULT_OKverilerinizi tutma amacını ekleyin.
  • finish()İkinci Etkinliği kapatmak için arayın .

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

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

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_TEXT, stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

3
Vay canına, teşekkür ederim! Aradığım şey buydu. Kamerayı veya diğer harici aygıtları kullanırken sonuçların geri gelmesini beklediğim açıktır, ancak dahili olarak kullanmayı düşünmüyordum. Çok açık bir şekilde koyan ilk sizsiniz.
user3195231

45

Güncel ben kullanımını söz ettiğini Not SharedPreference . Basit bir API'ye sahiptir ve bir uygulamanın etkinliklerinde erişilebilir. Ancak bu beceriksiz bir çözümdür ve hassas verilerin etrafından dolaşırsanız bir güvenlik riskidir. Amaçları kullanmak en iyisidir. Etkinlikler arasında birçok farklı veri türünü daha iyi aktarmak için kullanılabilecek aşırı yüklenmiş yöntemlerin kapsamlı bir listesine sahiptir. İntent.putExtra dosyasına bir göz atın . Bu bağlantı putExtra kullanımını oldukça iyi sunmaktadır.

Etkinlikler arasında veri aktarırken, tercih ettiğim yaklaşım, ilgili etkinlik için amacı başlatan gerekli parametreleri içeren statik bir yöntem oluşturmaktır. Bu daha sonra kolayca kurulum ve parametreleri almak sağlar. Yani şöyle görünebilir

public class MyActivity extends Activity {
    public static final String ARG_PARAM1 = "arg_param1";
...
public static getIntent(Activity from, String param1, Long param2...) {
    Intent intent = new Intent(from, MyActivity.class);
        intent.putExtra(ARG_PARAM1, param1);
        intent.putExtra(ARG_PARAM2, param2);
        return intent;
}

....
// Use it like this.
startActivity(MyActvitiy.getIntent(FromActivity.this, varA, varB, ...));
...

Ardından, amaçlanan etkinlik için bir amaç oluşturabilir ve tüm parametrelere sahip olduğunuzdan emin olabilirsiniz. Parçalara uyum sağlayabilirsiniz. Yukarıda basit bir örnek, ama fikri anladınız.


2
Cevabınızı en çok beğeniyorum ... Niyetten geçmek, neredeyse her yerde bir faaliyete başladığım oturumun dahil edilmesini hatırlamanız gerektiği anlamına gelir. SharedPreferences içine koyarak herhangi bir etkinlikten istediğiniz zaman alabilirsiniz. : 0)
bytebender

@bytebender Bunun yanıt için biraz geç olduğunu biliyorum, simlpicity için orijinal cevabımı beğendiğinizi takdir ediyorum, ancak oturum kimliğini paylaşılan tercihlerde saklamak için dikkatli olurum. Sabit depolama alanında saklamanız gerekiyorsa şifreleme kullanın. JWT kullanan bir kimlik doğrulama çerçeveleri kullanabiliyorsanız, uzun süreli depolama için daha güvenli olan refreshTokens'i içerecek ve ardından kimlik doğrulama belirteçlerine kolayca erişmek ve etkinlik üzerindeki ek yükü azaltmak için geçerli oturum belirtecini özel bir Uygulama nesnesinin genel mülkü olarak tutacaktır. niyet imzaları.
angryITguy

38

Aşağıdakileri yapmaya çalışın:

Bunun gibi basit bir "yardımcı" sınıf (Amaçlarınız için fabrika) oluşturun:

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

Bu, tüm Niyetleriniz için fabrika olacak. Yeni bir Amaca ihtiyacınız olduğunda, IntentHelper'da statik bir fabrika yöntemi oluşturun. Yeni bir Amaç oluşturmak için bunu şöyle söylemelisiniz:

IntentHelper.createYourSpecialIntent(getIntent());

Faaliyetinizde. Bir "oturumda" bazı verileri "kaydetmek" istediğinizde sadece aşağıdakileri kullanın:

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

Ve bu Niyeti gönderin. Hedef Etkinlik'te alanınız şu şekilde kullanılabilir olacaktır:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Artık Intent'i aynı eski oturum gibi kullanabiliriz (sunucu uygulamaları veya JSP'de olduğu gibi ).


28

Ayrıştırılabilir bir sınıf oluşturarak özel sınıf nesnelerini de iletebilirsiniz . Parsetabl yapmanın en iyi yolu, sınıfınızı yazmak ve daha sonra http://www.parcelabler.com/ gibi bir siteye yapıştırmaktır . Oluştur'a tıklayın ve yeni kod alacaksınız. Tüm bunları kopyalayın ve orijinal sınıf içeriğini değiştirin. Sonra-

Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);

ve NextActivity'de sonucu elde edersiniz.

Foo foo = getIntent().getExtras().getParcelable("foo");

Artık foo nesnesini kullandığınız gibi kullanabilirsiniz .


23

Başka bir yol, veri depoladığınız genel statik alanı kullanmaktır, yani:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

5
Önerinizin neden oy alamadığını merak ediyorum, daha basit ve daha pratik.
Porizm

7
um ... bu OO ilkelerini ihlal etmiyor mu?
Christian Vielma

2
@ChristianVielma, daha çok gri bir alan gibi ... birçok yoldan yapabilirsiniz, bana göre temiz bir "kurtulmak" gibi görünüyor, yani ... karar verirseniz (geliştirici) size kalmış sizin için iyi çalışıyor ya da değil, ben bu şekilde seviyorum çünkü takip etmek daha kolay, ama çok hızlı çok kirli alabilirsiniz ...
ComputerSaysNo

2
neden kirlendiğini söylüyorsun? İOS, buna benzer "özellikler" ayarlayarak görünüm denetleyicileri arasında veri iletmek için bunu yapmıyor mu? Bu, niyetleri kullanmaktan çok daha kolay
Terry Bu

2
Evet, verileri görünüm denetleyicileri arasında iletirsiniz, ancak statikle değil özelliklerle vermezsiniz. Sorun, istenen etkinlik örneğinde bir özellik olmamasıdır. Android'in startActivity () aracılığıyla etkinlikleri başlatması, nesneyi anında başlatmaz ve geliştiricinin bir örnek değişkeni ayarlamasına izin vermez. Oldukça sinir bozucu ...
Shawn

20

Verileri faaliyetler arasında aktarmanın en uygun yolu niyetleri iletmektir. Veri göndermek istediğiniz ilk etkinlikte kod eklemelisiniz,

String str = "My Data"; //Data you want to send
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("name",str); //Here you will add the data into intent to pass bw activites
v.getContext().startActivity(intent);

Ayrıca içe aktarmalısınız

import android.content.Intent;

Sonra bir sonraki Acitvity'de (SecondActivity), aşağıdaki kodu kullanarak verileri amaçtan almalısınız.

String name = this.getIntent().getStringExtra("name");

2
Bu, 1 yıl daha var olan en çok oy alan cevabın kopyası .
Murmel

19

Kullanabileceğiniz SharedPreferences...

  1. Kerestecilik. Zaman deposu oturum kimliğiSharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
  2. Oturumu Kapat. Paylaşılan tercihlerde zaman getirme oturumu kimliği

    SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE);
    String sessionId = preferences.getString("sessionId", null);

Gerekli oturum kimliğiniz yoksa paylaşılan tercihleri ​​kaldırın:

SharedPreferences settings = context.getSharedPreferences("session", Context.MODE_PRIVATE);
settings.edit().clear().commit();

Bu çok yararlıdır, çünkü bir kez değeri kaydeder ve daha sonra aktivitenin herhangi bir yerine erişirsiniz.


17

Standart yaklaşım.

Intent i = new Intent(this, ActivityTwo.class);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
String getrec=textView.getText().toString();
Bundle bundle = new Bundle();
bundle.putString(“stuff”, getrec);
i.putExtras(bundle);
startActivity(i);

Şimdi ikinci etkinliğinizde verilerinizi paketten alın:

Paketi alın

Bundle bundle = getIntent().getExtras();

Verileri çıkarın…

String stuff = bundle.getString(“stuff”); 

1
2012 yılında PRABEESH RK tarafından önerildiği gibi çoğaltın . Ve diğer 6 cevap tarafından önerilen i.putExtras()/ azaltılabilir getIntent().getString()...
Murmel

17

Faaliyetten

 int n= 10;
 Intent in = new Intent(From_Activity.this,To_Activity.class);
 Bundle b1 = new Bundle();
 b1.putInt("integerNumber",n);
 in.putExtras(b1);
 startActivity(in);

Faaliyete

 Bundle b2 = getIntent().getExtras();
 int m = 0;
 if(b2 != null)
  {
     m = b2.getInt("integerNumber");
  }

1
Kopya: Temel Bundleyaklaşım 2012'de PRABEESH RK ve Krishna Venugopal , Krishna tarafından zaten önerilmişti . Ve diğer 8 cevap tarafından önerilen i.putExtras()/ azaltılabilir getIntent().getString()...
Murmel

11

Niyet nesnesini kullanarak etkinlikler arasında veri gönderebilirsiniz. İki etkinliğiniz olduğunu düşünün FirstActivityve SecondActivity.

Inside FirstActivity:

Amaç kullanma:

i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)

Inside SecondActivity

Bundle bundle= getIntent().getExtras();

Artık Key ile FirstActivity'den geçirilen değerleri almak için farklı paket sınıfı yöntemleri kullanabilirsiniz.

Örn bundle.getString("key"). bundle.getDouble("key"), bundle.getInt("key")Vb.


1
Kopya: Temel Bundleyaklaşım 2012'de PRABEESH RK ve Ajay Venugopal tarafından zaten önerilmişti . Ve diğer 7 cevap tarafından önerilen i.putExtras()/ azaltılabilir getIntent().getString()...
Murmel

11

Bitmap'i Aktiviteler / Parçalar arasında aktarmak istiyorsanız


Aktivite

Aktiviteler arasında bir bitmap geçirmek için

Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);

Ve Activity sınıfında

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");

fragman

Parçalar arasında bir bitmap geçirmek için

SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);

SecondFragment içinde almak için

Bitmap bitmap = getArguments().getParcelable("bitmap");

Büyük Bitmap'leri Aktarma

Hatalı ciltleme işlemi alıyorsanız, büyük öğeyi bir etkinlikten başka bir etkinliğe aktararak ciltleyici işlem arabelleğini aştığınız anlamına gelir.

Yani bu durumda bir byte'ın dizi olarak bit eşlem sıkıştırmak zorunda ve sonra başka bir etkinlikle sıkıştırmayı böyle,

FirstActivity'de

Intent intent = new Intent(this, SecondActivity.class);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes);

Ve SecondActivity'de

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

9
Intent intent = new Intent(YourCurrentActivity.this, YourActivityName.class);
intent.putExtra("NAme","John");
intent.putExtra("Id",1);
startActivity(intent);

Başka bir etkinlikte alabilirsiniz. İki yol:

int id = getIntent.getIntExtra("id", /* defaltvalue */ 2);

İkinci yol:

Intent i = getIntent();
String name = i.getStringExtra("name");


8

İşte benim en iyi uygulama ve proje çok büyük ve karmaşık olduğunda çok yardımcı olur.

Ben 2 aktivitelere sahip, olduğunu varsayalım LoginActivityve HomeActivity. Ben 2 parametreleri (kullanıcı adı ve şifre) geçmek istiyorum LoginActivityiçin HomeActivity.

İlk olarak, HomeIntent

public class HomeIntent extends Intent {

    private static final String ACTION_LOGIN = "action_login";
    private static final String ACTION_LOGOUT = "action_logout";

    private static final String ARG_USERNAME = "arg_username";
    private static final String ARG_PASSWORD = "arg_password";


    public HomeIntent(Context ctx, boolean isLogIn) {
        this(ctx);
        //set action type
        setAction(isLogIn ? ACTION_LOGIN : ACTION_LOGOUT);
    }

    public HomeIntent(Context ctx) {
        super(ctx, HomeActivity.class);
    }

    //This will be needed for receiving data
    public HomeIntent(Intent intent) {
        super(intent);
    }

    public void setData(String userName, String password) {
        putExtra(ARG_USERNAME, userName);
        putExtra(ARG_PASSWORD, password);
    }

    public String getUsername() {
        return getStringExtra(ARG_USERNAME);
    }

    public String getPassword() {
        return getStringExtra(ARG_PASSWORD);
    }

    //To separate the params is for which action, we should create action
    public boolean isActionLogIn() {
        return getAction().equals(ACTION_LOGIN);
    }

    public boolean isActionLogOut() {
        return getAction().equals(ACTION_LOGOUT);
    }
}

LoginActivity'deki verileri şu şekilde aktarıyorum

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        String username = "phearum";
        String password = "pwd1133";
        final boolean isActionLogin = true;
        //Passing data to HomeActivity
        final HomeIntent homeIntent = new HomeIntent(this, isActionLogin);
        homeIntent.setData(username, password);
        startActivity(homeIntent);

    }
}

Son adım, verileri nasıl alacağım HomeActivity

public class HomeActivity extends AppCompatActivity {

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

        //This is how we receive the data from LoginActivity
        //Make sure you pass getIntent() to the HomeIntent constructor
        final HomeIntent homeIntent = new HomeIntent(getIntent());
        Log.d("HomeActivity", "Is action login?  " + homeIntent.isActionLogIn());
        Log.d("HomeActivity", "username: " + homeIntent.getUsername());
        Log.d("HomeActivity", "password: " + homeIntent.getPassword());
    }
}

Bitti! Harika :) Deneyimlerimi paylaşmak istiyorum. Küçük bir proje üzerinde çalışıyorsanız, bu büyük bir sorun olmamalıdır. Ancak büyük proje üzerinde çalışırken, hataları yeniden düzenlemek veya düzeltmek istediğinizde gerçekten acı çekiyor.


7

Tamamlayıcı Yanıt: Anahtar Dizesi için Adlandırma Kuralları

Gerçek veri aktarma süreci zaten cevaplanmıştır, ancak cevapların çoğu Niyet'teki anahtar adı için sabit kodlu dizeler kullanır. Bu, yalnızca uygulamanızda kullanıldığında genellikle iyidir. Ancak, belgelerEXTRA_* standart veri türleri için sabitlerin kullanılmasını önerir .

Örnek 1: Intent.EXTRA_*Tuşları kullanma

İlk aktivite

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);

İkinci aktivite:

Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);

Örnek 2: Kendinizin tanımlanması static final anahtarınızı

Biri varsa Intent.EXTRA_*Strings ihtiyaçlarınızı yakışmıyor, önce etkinliğin başında kendi tanımlayabilirsiniz.

static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";

Paket adını eklemek sadece anahtarı kendi uygulamanızda kullanıyorsanız sadece bir kuraldır. Ancak, diğer uygulamaların bir Amaçla arayabileceği bir tür hizmet oluşturuyorsanız, adlandırma çakışmalarını önlemek bir zorunluluktur.

İlk aktivite:

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);

İkinci aktivite:

Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);

Örnek 3: Bir String kaynak anahtarı kullanma

Belgelerde belirtilmemesine rağmen, bu cevap , etkinlikler arasındaki bağımlılıkları önlemek için bir String kaynağı kullanmanızı önerir.

strings.xml

 <string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>

İlk aktivite

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);

İkinci aktivite

Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));

7

Kullanabilirsiniz Intent

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);

Başka bir yol da singleton desenini kullanmak olabilir :

public class DataHolder {

 private static DataHolder dataHolder;
 private List<Model> dataList;

 public void setDataList(List<Model>dataList) {
    this.dataList = dataList;
 }

 public List<Model> getDataList() {
    return dataList;
 }

 public synchronized static DataHolder getInstance() {
    if (dataHolder == null) {
       dataHolder = new DataHolder();
    }
    return dataHolder;
 }
}

FirstActivity'den

private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);

SecondActivity'de

private List<Model> dataList = DataHolder.getInstance().getDataList();


6

Verilerin faaliyetler arasında aktarılması esas olarak bir niyet nesnesi vasıtasıyla yapılır.

Öncelikle verileri Bundlesınıfın kullanımıyla niyet nesnesine iliştirmeniz gerekir . Ardından, ya startActivity()da startActivityForResult()yöntemleri kullanarak etkinliği çağırın .

Bu konuda daha fazla bilgi bulabilirsiniz, blog etkinliğinden bir Etkinliğe veri aktarma örneğinden bir örnek bulabilirsiniz .


Bu, doğrudan sağlanan Niyet yöntemlerini ( ) kullanarak aşağı yukarı aynıdır . Ama bir tane daha ekler ve işleri daha karmaşık hale getirir. Intent#putExtra()Bundle
Murmel

6

Paylaşılan Tercih'i deneyebilirsiniz, etkinlikler arasında veri paylaşmak için iyi bir alternatif olabilir

Oturum kimliğini kaydetmek için -

SharedPreferences pref = myContexy.getSharedPreferences("Session 
Data",MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("Session ID", session_id);
edit.commit();

Onları almak için -

SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);

Kopya: Bu yaklaşım 2014 yılında Ravi Parsania tarafından zaten desteklendi
Murmel

5

Bundle Nesnesi aracılığıyla bu etkinlik geçirme parametrelerinden başka bir etkinlik başlatma

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);

Başka bir etkinliğe erişme (YourActivity)

String s = getIntent().getStringExtra("USER_NAME");

Bu basit tür veri türü için uygundur. Ama u aktivite arasında karmaşık veri geçmek istiyorsanız u önce serileştirmek gerekir.

İşte Çalışan Modelimiz var

class Employee{
    private String empId;
    private int age;
    print Double salary;

    getters...
    setters...
}

Bunun gibi karmaşık verileri serileştirmek için google tarafından sağlanan Gson lib'i kullanabilirsiniz

String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);

Bundle bundle = getIntent().getExtras();
String empStr = bundle.getString("EMP");
            Gson gson = new Gson();
            Type type = new TypeToken<Employee>() {
            }.getType();
            Employee selectedEmp = gson.fromJson(empStr, type);

5

Kotlin

İlk Etkinlikten Geç

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

İkinci Etkinliğe Katılın

val value = getIntent().getStringExtra("key")

Öneri

Daha yönetilen bir yol için anahtarları her zaman sabit dosyaya koyun.

companion object {
    val KEY = "key"
}

4
/*
 * If you are from transferring data from one class that doesn't
 * extend Activity, then you need to do something like this.
 */ 

public class abc {
    Context context;

    public abc(Context context) {
        this.context = context;
    }

    public void something() {
        context.startactivity(new Intent(context, anyone.class).putextra("key", value));
    }
}

4

Charlie Collins bana mükemmel verdi cevabı kullanarak Application.class. Kolayca alt sınıflandırabileceğimizin farkında değildim. Özel bir uygulama sınıfı kullanan basitleştirilmiş bir örnek.

AndroidManifest.xml

android:nameKendi uygulama sınıfınızı kullanması için özniteliği verin .

...
<application android:name="MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
....

MyApplication.java

Bunu genel referans sahibi olarak kullanın. Aynı süreç içinde iyi çalışır.

public class MyApplication extends Application {
    private MainActivity mainActivity;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public void setMainActivity(MainActivity activity) { this.mainActivity=activity; }
    public MainActivity getMainActivity() { return mainActivity; }
}

MainActivity.java

Uygulama örneğine genel "singleton" başvurusunu ayarlayın.

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((MyApplication)getApplication()).setMainActivity(this);
    }
    ...

}

MyPreferences.java

Başka bir etkinlik örneğindeki bir ana etkinliği kullandığım basit bir örnek.

public class MyPreferences extends PreferenceActivity
            implements SharedPreferences.OnSharedPreferenceChangeListener {
    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        if (!key.equals("autostart")) {
            ((MyApplication)getApplication()).getMainActivity().refreshUI();
        }
    }
}

4

Kısa süre önce , bunun gibi her türlü işi daha kolay hale getiren jQuery aromalı bir Android çerçevesi olan Vapor API'yi piyasaya sürdüm . Belirtildiği gibi, SharedPreferencesbunu yapabilmenin bir yolu.

VaporSharedPreferencesbir seçenek olarak Singleton olarak uygulanır ve Vapor API'de aşırı yüklenmiş bir .put(...)yönteme sahiptir, böylece desteklediğiniz veri türü hakkında açıkça endişelenmenize gerek kalmaz. Ayrıca akıcıdır, böylece aramaları zincirleyebilirsiniz:

$.prefs(...).put("val1", 123).put("val2", "Hello World!").put("something", 3.34);

Ayrıca isteğe bağlı olarak değişiklikleri otomatik olarak kaydeder ve okuma ve yazma işlemini başlık altında birleştirir, böylece standart Android'de yaptığınız gibi bir Editör'ü açıkça almanıza gerek kalmaz.

Alternatif olarak bir Intent. Vapor API'de ayrıca zincirlenebilir aşırı yüklenmiş .put(...)yöntemi birVaporIntent :

$.Intent().put("data", "myData").put("more", 568)...

Ve diğer cevaplarda belirtildiği gibi ekstra olarak geçirin. Ekstraları kendinizden Activityve ayrıca kullanıyorsanızVaporActivity bunu sizin için otomatik olarak yapılır, böylece şunları yapabilirsiniz:

this.extras()

Onları diğer uçta almak için Activitygeçiş yapın.

Bazıları için ilgi umuyoruz :)


@BaneeIshaqueK evet, bir süredir bunu sürdürmedik. Yardımcı olması durumunda projenin doğrudan Github'a işaret edecek şekilde güncellenmiş bağlantısını güncelleyin. ps. Bu lisans için ne düşündüğümden emin değilim ... özür
Darius

4

İlk Faaliyet:

Intent intent = new Intent(getApplicationContext(), ClassName.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

İkinci Etkinlik:

String str= getIntent().getStringExtra("Variable name which you sent as an extra");

4

Uygulamadaki aktiviteler arasında 3 şekilde veri aktarabilirsiniz

  1. niyet
  2. Paylaşılan Tercihler
  3. Uygulama

niyetle geçen verilerin bir miktar sınırı vardır. Büyük miktarda veri için Uygulama düzeyinde veri paylaşımını kullanabilirsiniz ve SharedPreference uygulamasında depolayarak uygulama boyutunuz artar


3

Genel bir sınıf kullanın:

public class GlobalClass extends Application
{
    private float vitamin_a;


    public float getVitaminA() {
        return vitamin_a;
    }

    public void setVitaminA(float vitamin_a) {
        this.vitamin_a = vitamin_a;
    }
}

Bu sınıfın ayarlayıcılarını ve alıcılarını diğer tüm sınıflardan çağırabilirsiniz. Bunu yapın, her Actitity'de bir GlobalClass-Object yapmanız gerekir:

GlobalClass gc = (GlobalClass) getApplication();

Ardından örneğin:

gc.getVitaminA()

Uygulamayı geçersiz kılma - Bu Whome'in cevabının
Murmel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.