Android
Absicht
Suche…
Einführung
Eine Absicht ist eine kleine Nachricht, die um das Android-System herumgeleitet wird. Diese Nachricht enthält möglicherweise Informationen zu unserer Absicht, eine Aufgabe auszuführen.
Es handelt sich im Wesentlichen um eine passive Datenstruktur, die eine abstrakte Beschreibung einer auszuführenden Aktion enthält.
Syntax
- Absicht Absicht ()
- Vorsatz (Vorsatz)
- Absicht Absicht (String-Aktion)
- Intent Intent (String-Aktion, Uri Uri)
- Intent Intent (Context packageContext, Klasse <?> Cls)
- Intent Intent (String-Aktion, Uri-Uri, KontextpaketContext, Klasse <?> Cls)
- void startActivity (Absichtsabsicht)
- void startActivity (Absichtsabsicht, Bundle-Optionen)
- void startActivityForResult (Absichtsabsicht, int requestCode)
- void startActivityForResult (Intent Intent, Int requestCode, Bundle-Optionen)
- Intention putExtra (Stringname, doppelter [] -Wert)
- Intention putExtra (Stringname, int-Wert)
- Intention putExtra (String-Name, CharSequence-Wert)
- Intention putExtra (String-Name, Char-Wert)
- Intention putExtra (Stringname, Bundle-Wert)
- Intention putExtra (String-Name, Wert für Parcelable [])
- Intention putExtra (Stringname, serialisierbarer Wert)
- Intention putExtra (Stringname, int [] -Wert)
- Intention putExtra (Stringname, Gleitkommawert)
- Intention putExtra (Stringname, Byte [] -Wert)
- Intention putExtra (Stringname, langer [] -Wert)
- Intention putExtra (Stringname, Wert für Parcelable)
- Intention putExtra (Stringname, Gleitkommawert [])
- Intention putExtra (Stringname, langer Wert)
- Intention putExtra (Stringname, String [] -Wert)
- Intention putExtra (Stringname, boolescher Wert)
- Intention putExtra (Stringname, boolescher [] -Wert)
- Intention putExtra (Stringname, kurzer Wert)
- Intention putExtra (Stringname, doppelter Wert)
- Intention putExtra (Stringname, kurzer [] -Wert)
- Intention putExtra (Stringname, Stringwert)
- Intention putExtra (Stringname, Byte-Wert)
- Intention putExtra (Stringname, char [] -Wert)
- Intention putExtra (Stringname, CharSequence [] -Wert)
Parameter
Parameter | Einzelheiten |
---|---|
Absicht | Die Absicht zu beginnen |
Anfrage Code | Eindeutige Nummer zur Identifizierung der Anfrage |
Optionen | Zusätzliche Optionen, wie die Aktivität gestartet werden soll |
Name | Der Name der zusätzlichen Daten |
Wert | Der Wert der zusätzlichen Daten |
CHOOSE_CONTACT_REQUEST_CODE | der Code der Anforderung, um sie in der onActivityResult Methode zu identifizieren |
Aktion | Jede über diese Absicht auszuführende Aktion, zB Intent.ACTION_VIEW |
uri | data-uri, der von einer bestimmten Aktion verwendet werden soll |
packageContext | Kontext zum Initialisieren der Absicht |
cls | Klasse, die von dieser Absicht verwendet werden soll |
Bemerkungen
Vorsichtsmaßnahmen bei der Verwendung impliziter Absichten
Beim Aufruf einer impliziten Absicht ist es immer hilfreich zu prüfen, ob es vom System möglich ist, damit umzugehen.
Dies kann durch Überprüfen mit PackageManager.queryIntentActivities(Intent intent, int flags)
PackageManager pm = getActivity().getPackageManager();
if (intent.resolveActivity(pm) != null) {
//intent can be handled
startActivity(intent);
} else {
//intent can not be handled
}
singleTask
der es sich um einen singleTask
oder singleTop
Wenn der Startmodus der Aktivität singleTask
oder singleTop
, wird singleTask
singleTop
, sobald die Aktivität mit einem singleTop
onActivityResult
wird. Um dies zu verhindern, verwenden Sie Intent.setFlags(0)
, um die Standardflags zurückzusetzen.
Eine Aktivität starten
In diesem Beispiel wird DestinationActivity
von OriginActivity
aus OriginActivity
.
Hier nimmt der Intent
Konstruktor zwei Parameter an:
- Ein Kontext als erster Parameter (wird verwendet, da die Activity-Klasse eine Unterklasse von Context ist)
- Die Klasse der App-Komponente, an die das System die Absicht liefern soll (in diesem Fall die Aktivität, die gestartet werden soll)
public class OriginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_origin);
Intent intent = new Intent(this, DestinationActivity.class);
startActivity(intent);
finish(); // Optionally, you can close OriginActivity. In this way when the user press back from DestinationActivity he/she won't land on OriginActivity again.
}
}
Eine andere Methode zum Erstellen des Intent
zum Öffnen von DestinationActivity
besteht darin, den Standardkonstruktor für den Intent
und die setClass()
Methode zu verwenden, um setClass()
, welche Aktivität geöffnet werden soll:
Intent i=new Intent();
i.setClass(this, DestinationActivity.class);
startActivity(intent);
finish(); // Optionally, you can close OriginActivity. In this way when the user press back from DestinationActivity he/she won't land on OriginActivity
Weitergabe von Daten zwischen Aktivitäten
Dieses Beispiel zeigt das Senden eines String
mit dem Wert "Some data!"
von OriginActivity
zu DestinationActivity
.
HINWEIS: Dies ist der einfachste Weg, Daten zwischen zwei Aktivitäten zu senden. Im Beispiel zur Verwendung des Startermusters finden Sie eine robustere Implementierung.
OriginActivity
public class OriginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_origin);
// Create a new Intent object, containing DestinationActivity as target Activity.
final Intent intent = new Intent(this, DestinationActivity.class);
// Add data in the form of key/value pairs to the intent object by using putExtra()
intent.putExtra(DestinationActivity.EXTRA_DATA, "Some data!");
// Start the target Activity with the intent object
startActivity(intent);
}
}
DestinationActivity
public class DestinationActivity extends AppCompatActivity {
public static final String EXTRA_DATA = "EXTRA_DATA";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_destination);
// getIntent() returns the Intent object which was used to start this Activity
final Intent intent = getIntent();
// Retrieve the data from the intent object by using the same key that
// was previously used to add data to the intent object in OriginActivity.
final String data = intent.getStringExtra(EXTRA_DATA);
}
}
Es ist auch möglich , andere passieren primitive
Datentypen sowie arrays
, Bundle
und Parcelable
Daten. Das Passieren von Serializable
ist ebenfalls möglich, sollte jedoch vermieden werden, da es mehr als dreimal langsamer ist als Parcelable
.
Serializable ist eine Standard-Java- interface
. Sie können eine Klasse einfach als Serializable
markieren, indem Sie die Serializable
interface
implementieren interface
und Java wird sie in den erforderlichen Situationen automatisch serialisieren.
Parcelable ist eine Android-spezifische interface
die für benutzerdefinierte Datentypen (z. B. eigene Objekte / POJO-Objekte) implementiert werden kann. Dadurch kann Ihr Objekt reduziert werden und sich selbst rekonstruieren, ohne dass das Ziel etwas tun muss. Es gibt ein Dokumentationsbeispiel , um ein Objekt parcelabel zu machen .
Sobald Sie ein parcelable
Objekt haben, können Sie es wie ein primitiver Typ mit einem Intent-Objekt senden:
intent.putExtra(DestinationActivity.EXTRA_DATA, myParcelableObject);
Oder in einem Bundle / als Argument für ein Fragment:
bundle.putParcelable(DestinationActivity.EXTRA_DATA, myParcelableObject);
und dann mit getParcelableExtra aus dem Intent am Ziel lesen:
final MyParcelableType data = intent.getParcelableExtra(EXTRA_DATA);
Oder wenn Sie ein Fragment aus einem Bundle einlesen:
final MyParcelableType data = bundle.getParcelable(EXTRA_DATA);
Sobald Sie ein Serializable
Objekt haben, können Sie es in ein Intent-Objekt einfügen:
bundle.putSerializable(DestinationActivity.EXTRA_DATA, mySerializableObject);
und dann lesen Sie es auch aus dem Intent-Objekt am Ziel, wie unten gezeigt:
final SerializableType data = (SerializableType)bundle.getSerializable(EXTRA_DATA);
E-Mails senden
// Compile a Uri with the 'mailto' schema
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto","[email protected]", null));
// Subject
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Hello World!");
// Body of email
emailIntent.putExtra(Intent.EXTRA_TEXT, "Hi! I am sending you a test email.");
// File attachment
emailIntent.putExtra(Intent.EXTRA_STREAM, attachedFileUri);
// Check if the device has an email client
if (emailIntent.resolveActivity(getPackageManager()) != null) {
// Prompt the user to select a mail app
startActivity(Intent.createChooser(emailIntent,"Choose your mail application"));
} else {
// Inform the user that no email clients are installed or provide an alternative
}
Dadurch wird eine E-Mail in einer E-Mail-App nach Wahl des Benutzers ausgefüllt.
Wenn Sie einen Anhang hinzufügen müssen, können Sie Intent.ACTION_SEND
anstelle von Intent.ACTION_SENDTO
. Für mehrere Anhänge können Sie ACTION_SEND_MULTIPLE
Ein Wort der Vorsicht: Nicht jedes Gerät hat einen Provider für ACTION_SENDTO
, und der Aufruf von startActivity()
ohne resolveActivity()
Überprüfung mit resolveActivity()
kann eine ActivityNotFoundException resolveActivity()
.
Ein Ergebnis aus einer anderen Aktivität erhalten
Mit startActivityForResult(Intent intent, int requestCode)
Sie eine andere Activity
starten und dann ein Ergebnis dieser Activity
in der onActivityResult(int requestCode, int resultCode, Intent data)
. Das Ergebnis wird als Intent
. Ein Intent kann Daten über ein Bundle enthalten
In diesem Beispiel MainActivity
eine DetailActivity
und erwartet dann ein Ergebnis. Jeder onActivityResult(int requestCode, int resultCode, Intent data)
sollte seinen eigenen int
Anforderungscode haben, sodass in der überschriebenen onActivityResult(int requestCode, int resultCode, Intent data)
in MainActivity
werden kann, welche Anforderung verarbeitet werden soll, indem die Werte von requestCode
und REQUEST_CODE_EXAMPLE
(obwohl in diesem REQUEST_CODE_EXAMPLE
verglichen werden Beispiel gibt es nur einen).
Hauptaktivität:
public class MainActivity extends Activity {
// Use a unique request code for each use case
private static final int REQUEST_CODE_EXAMPLE = 0x9345;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create a new instance of Intent to start DetailActivity
final Intent intent = new Intent(this, DetailActivity.class);
// Start DetailActivity with the request code
startActivityForResult(intent, REQUEST_CODE_EXAMPLE);
}
// onActivityResult only get called
// when the other Activity previously started using startActivityForResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// First we need to check if the requestCode matches the one we used.
if(requestCode == REQUEST_CODE_EXAMPLE) {
// The resultCode is set by the DetailActivity
// By convention RESULT_OK means that whatever
// DetailActivity did was executed successfully
if(resultCode == Activity.RESULT_OK) {
// Get the result from the returned Intent
final String result = data.getStringExtra(DetailActivity.EXTRA_DATA);
// Use the data - in this case, display it in a Toast.
Toast.makeText(this, "Result: " + result, Toast.LENGTH_LONG).show();
} else {
// setResult wasn't successfully executed by DetailActivity
// Due to some error or flow of control. No data to retrieve.
}
}
}
}
DetailAktivität:
public class DetailActivity extends Activity {
// Constant used to identify data sent between Activities.
public static final String EXTRA_DATA = "EXTRA_DATA";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
final Button button = (Button) findViewById(R.id.button);
// When this button is clicked we want to return a result
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Create a new Intent object as container for the result
final Intent data = new Intent();
// Add the required data to be returned to the MainActivity
data.putExtra(EXTRA_DATA, "Some interesting data!");
// Set the resultCode as Activity.RESULT_OK to
// indicate a success and attach the Intent
// which contains our result data
setResult(Activity.RESULT_OK, data);
// With finish() we close the DetailActivity to
// return back to MainActivity
finish();
}
});
}
@Override
public void onBackPressed() {
// When the user hits the back button set the resultCode
// as Activity.RESULT_CANCELED to indicate a failure
setResult(Activity.RESULT_CANCELED);
super.onBackPressed();
}
}
Ein paar Dinge, die Sie beachten sollten:
Daten werden nur zurückgegeben, wenn Sie
finish()
aufrufen. Sie müssensetResult()
aufrufen, bevor Siefinish()
aufrufen. Andernfalls wird kein Ergebnis zurückgegeben.android:launchMode="singleTask"
Sie sicher, dass IhreActivity
android:launchMode="singleTask"
nicht verwendetandroid:launchMode="singleTask"
wird dieActivity
in einer separaten Task ausgeführt. Daher erhalten Sie kein Ergebnis. Wenn IhreActivity
singleTask
als Startmodus verwendet, wirdonActivityResult()
sofort mit dem ErgebniscodeActivity.RESULT_CANCELED
onActivityResult()
.Seien Sie vorsichtig bei der Verwendung von
android:launchMode="singleInstance"
. Auf Geräten vor Lollipop (Android 5.0, API Level 21) wird von Aktivitäten kein Ergebnis zurückgegeben.
- Sie können explizite oder implizite Absichten verwenden, wenn Sie
startActivityForResult()
aufrufen. Wenn Sie eine Ihrer eigenen Aktivitäten starten, um ein Ergebnis zu erhalten, sollten Sie eine explizite Absicht verwenden, um sicherzustellen, dass Sie das erwartete Ergebnis erhalten. Eine expliziteintent
wird immer an das Ziel geliefert, egal was es enthält. derfilter
wird nicht konsultiert. Eine implizite Absicht wird jedoch nur dann an eine Komponente übergeben, wenn sie einen der Filter der Komponente passieren kann.
Öffnen Sie eine URL in einem Browser
Mit dem Standardbrowser öffnen
Dieses Beispiel zeigt, wie Sie eine URL programmgesteuert im integrierten Webbrowser und nicht in Ihrer Anwendung öffnen können. Dadurch kann Ihre App eine Webseite öffnen, ohne dass die INTERNET
Berechtigung in Ihre Manifestdatei eingefügt werden muss.
public void onBrowseClick(View v) {
String url = "http://www.google.com";
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
// Verify that the intent will resolve to an activity
if (intent.resolveActivity(getPackageManager()) != null) {
// Here we use an intent without a Chooser unlike the next example
startActivity(intent);
}
}
Aufforderung an den Benutzer, einen Browser auszuwählen
Beachten Sie, dass dieses Beispiel die Methode Intent.createChooser()
verwendet:
public void onBrowseClick(View v) {
String url = "http://www.google.com";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
// Note the Chooser below. If no applications match,
// Android displays a system message.So here there is no need for try-catch.
startActivity(Intent.createChooser(intent, "Browse with"));
}
In einigen Fällen kann die URL mit "www" beginnen . In diesem Fall erhalten Sie diese Ausnahme:
android.content.ActivityNotFoundException
: Es wurde keine Aktivität zumandroid.content.ActivityNotFoundException
Absicht gefunden
Die URL muss immer mit "http: //" oder "https: //" beginnen . Ihr Code sollte daher prüfen, wie im folgenden Code-Snippet gezeigt:
if (!url.startsWith("https://") && !url.startsWith("http://")){
url = "http://" + url;
}
Intent openUrlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
if (openUrlIntent.resolveActivity(getPackageManager()) != null) {
startActivity(openUrlIntent);
}
Best Practices
Prüfen Sie, ob sich auf dem Gerät keine Apps befinden, die die implizite Absicht erhalten können. Andernfalls stürzt Ihre App ab, wenn sie startActivity()
. Um zunächst zu überprüfen, ob eine App vorhanden ist, um die Absicht zu erhalten, rufen Sie resolveActivity()
für Ihr Intent-Objekt auf. Wenn das Ergebnis nicht null ist, gibt es mindestens eine App, die die Absicht verarbeiten kann, und es ist sicher, startActivity()
. Wenn das Ergebnis null ist, sollten Sie die Absicht nicht verwenden und wenn möglich, sollten Sie die Funktion deaktivieren, die die Absicht aufruft.
Löschen eines Aktivitätsstapels
Manchmal möchten Sie möglicherweise eine neue Aktivität starten, während Sie vorherige Aktivitäten aus dem hinteren Stapel entfernen, sodass Sie mit der Zurück-Schaltfläche nicht wieder zu ihnen zurückkehren können. Ein Beispiel hierfür könnte das Starten einer App in der Login-Aktivität sein, die Sie zur Main-Aktivität Ihrer Anwendung führt. Beim Abmelden möchten Sie jedoch zurück zum Login geleitet werden, ohne die Möglichkeit zur erneuten Anmeldung. In einem FLAG_ACTIVITY_CLEAR_TOP
Fall können Sie das Flag FLAG_ACTIVITY_CLEAR_TOP
für die Absicht FLAG_ACTIVITY_CLEAR_TOP
, d. FLAG_ACTIVITY_CLEAR_TOP
, Wenn die gerade gestartete Aktivität bereits in der aktuellen Task (LoginActivity) ausgeführt wird, und nicht eine neue Instanz dieser Aktivität, sondern alle anderen Aktivitäten oben Davon wird geschlossen, und diese Absicht wird als (neue) Aktivität an die (jetzt oben) alte Aktivität übergeben.
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Sie können auch die Flags FLAG_ACTIVITY_NEW_TASK
zusammen mit FLAG_ACTIVITY_CLEAR_TASK
wenn Sie alle Aktivitäten auf dem FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TASK
möchten:
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
// Closing all the Activities, clear the back stack.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Beabsichtigte URI
Dieses Beispiel zeigt, wie Sie die Absicht vom Browser aus starten:
<a href="intent://host.com/path#Intent;package=com.sample.test;scheme=yourscheme;end">Start intent</a>
Diese Absicht startet die App mit dem Paket com.sample.test
oder öffnet Google Play mit diesem Paket.
Auch diese Absicht kann mit Javascript gestartet werden:
var intent = "intent://host.com/path#Intent;package=com.sample.test;scheme=yourscheme;end";
window.location.replace(intent)
In der Aktivität können dieser Host und dieser Pfad aus Absichtsdaten erhalten werden:
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
Uri data = getIntent().getData(); // returns host.com/path
}
Intent URI-Syntax:
HOST/URI-path // Optional host
#Intent;
package=[string];
action=[string];
category=[string];
component=[string];
scheme=[string];
end;
Senden von Nachrichten an andere Komponenten
Absichten können verwendet werden, um Nachrichten an andere Komponenten Ihrer Anwendung (z. B. einen laufenden Hintergrunddienst) oder an das gesamte Android-System zu senden.
Verwenden LocalBroadcastManager
zum Senden einer Übertragung innerhalb Ihrer Anwendung die LocalBroadcastManager
Klasse:
Intent intent = new Intent("com.example.YOUR_ACTION"); // the intent action
intent.putExtra("key", "value"); // data to be passed with your broadcast
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
manager.sendBroadcast(intent);
Um ein Broadcast an Komponenten außerhalb Ihrer Anwendung zu senden, verwenden Sie die sendBroadcast()
-Methode für ein Context
Objekt.
Intent intent = new Intent("com.example.YOUR_ACTION"); // the intent action
intent.putExtra("key", "value"); // data to be passed with your broadcast
context.sendBroadcast(intent);
Informationen zum Empfang von Broadcasts finden Sie hier: Broadcast Receiver
CustomTabsIntent für benutzerdefinierte Registerkarten
Mit einem CustomTabsIntent
ist es jetzt möglich, benutzerdefinierte Chrome-Registerkarten zu konfigurieren, um wichtige UI-Komponenten in dem Browser anzupassen, der über Ihre App geöffnet wird.
Dies ist in einigen Fällen eine gute Alternative zur Verwendung eines WebView. Es ermöglicht das Laden einer Webseite mit einem Intent, mit der zusätzlichen Möglichkeit, ein gewisses Maß an Aussehen und Verhalten Ihrer App in den Browser einzufügen.
Hier ein Beispiel, wie Sie eine URL mit CustomTabsIntent
String url = "https://www.google.pl/";
CustomTabsIntent intent = new CustomTabsIntent.Builder()
.setStartAnimations(getContext(), R.anim.slide_in_right, R.anim.slide_out_left)
.setExitAnimations(getContext(), android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.setCloseButtonIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_arrow_back_white_24dp))
.setToolbarColor(Color.parseColor("#43A047"))
.enableUrlBarHiding()
.build();
intent.launchUrl(getActivity(), Uri.parse(url));
Hinweis:
Um benutzerdefinierte Registerkarten verwenden zu können, müssen Sie diese Abhängigkeit zu Ihrem build.gradle hinzufügen
compile 'com.android.support:customtabs:24.1.1'
Gemeinsame Verwendung mehrerer Dateien
Die String-Liste, die der share()
-Methode als Parameter übergeben wird, enthält die Pfade aller Dateien, die Sie freigeben möchten.
Es durchläuft im Wesentlichen die Pfade, fügt sie zu Uri hinzu und startet die Aktivität, die Dateien dieses Typs annehmen kann.
public static void share(AppCompatActivity context,List<String> paths) {
if (paths == null || paths.size() == 0) {
return;
}
ArrayList<Uri> uris = new ArrayList<>();
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_SEND_MULTIPLE);
intent.setType("*/*");
for (String path : paths) {
File file = new File(path);
uris.add(Uri.fromFile(file));
}
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
context.startActivity(intent);
}
Starter-Muster
Dieses Muster ist ein strengerer Ansatz, um eine Activity
zu starten. Ihr Zweck besteht darin, die Lesbarkeit des Codes zu verbessern und gleichzeitig die Komplexität des Codes, die Wartungskosten und die Kopplung Ihrer Komponenten zu reduzieren.
Im folgenden Beispiel wird das Startermuster implementiert, das normalerweise als statische Methode für die Activity
selbst implementiert wird. Diese statische Methode akzeptiert alle erforderlichen Parameter, erstellt aus diesen Daten eine gültige Intent
und startet dann die Activity
.
Ein Intent
ist ein Objekt, das Laufzeitbindung zwischen separaten Komponenten, z. B. zwei Aktivitäten, bereitstellt. Die Absicht repräsentiert die Absicht einer App, etwas zu tun. Sie können Absichten für eine Vielzahl von Aufgaben verwenden, aber hier beginnt Ihre Absicht mit einer anderen Aktivität.
public class ExampleActivity extends AppCompatActivity {
private static final String EXTRA_DATA = "EXTRA_DATA";
public static void start(Context context, String data) {
Intent intent = new Intent(context, ExampleActivity.class);
intent.putExtra(EXTRA_DATA, data);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if(!intent.getExtras().containsKey(EXTRA_DATA)){
throw new UnsupportedOperationException("Activity should be started using the static start method");
}
String data = intent.getStringExtra(EXTRA_DATA);
}
}
Mit diesem Muster können Sie auch erzwingen, dass zusätzliche Daten mit der Absicht übergeben werden.
Die ExampleActivity
kann dann wie ExampleActivity
gestartet werden, wobei context
ein Aktivitätskontext ist:
ExampleActivity.start(context, "Some data!");
Starten Sie Unbound Service mit einer Absicht
Ein Service ist eine Komponente, die im Hintergrund (im UI-Thread) ohne direkte Interaktion mit dem Benutzer ausgeführt wird. Ein ungebundener Dienst wird gerade gestartet und ist nicht an den Lebenszyklus einer Aktivität gebunden.
Um einen Dienst zu starten, können Sie wie im folgenden Beispiel gezeigt:
// This Intent will be used to start the service
Intent i= new Intent(context, ServiceName.class);
// potentially add data to the intent extras
i.putExtra("KEY1", "Value to be used by the service");
context.startService(i);
Sie können alle Extras der Absicht verwenden, indem Sie eine onStartCommand()
Überschreibung verwenden:
public class MyService extends Service {
public MyService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
if (intent != null) {
Bundle extras = intent.getExtras();
String key1 = extras.getString("KEY1", "");
if (key1.equals("Value to be used by the service")) {
//do something
}
}
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
Absicht teilen
Teilen Sie einfache Informationen mit verschiedenen Apps.
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));
Teilen Sie ein Bild mit verschiedenen Apps.
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
Starten Sie den Dialer
In diesem Beispiel wird gezeigt, wie ein Standardwählgerät (eine App, die normale Anrufe tätigt) mit einer vorhandenen Telefonnummer geöffnet wird:
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:9988776655")); //Replace with valid phone number. Remember to add the tel: prefix, otherwise it will crash.
startActivity(intent);
Ergebnis durch Ausführen des obigen Codes:
Google-Karte mit angegebenem Breitengrad und Längengrad öffnen
Mit Intent können Sie Breiten- und Längengrade von Ihrer App an die Google-Karte übergeben
String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?q=loc:%f,%f", 28.43242324,77.8977673);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);
Weitergabe verschiedener Daten durch Intent in Activity
1. Übergeben von Integer-Daten:
SenderActivity
Intent myIntent = new Intent(SenderActivity.this, ReceiverActivity.class);
myIntent.putExtra("intVariableName", intValue);
startActivity(myIntent);
ReceiverActivity
Intent mIntent = getIntent();
int intValue = mIntent.getIntExtra("intVariableName", 0); // set 0 as the default value if no value for intVariableName found
2. Doppeldaten übergeben:
SenderActivity
Intent myIntent = new Intent(SenderActivity.this, ReceiverActivity.class);
myIntent.putExtra("doubleVariableName", doubleValue);
startActivity(myIntent);
ReceiverActivity
Intent mIntent = getIntent();
double doubleValue = mIntent.getDoubleExtra("doubleVariableName", 0.00); // set 0.00 as the default value if no value for doubleVariableName found
3. String-Daten übergeben:
SenderActivity
Intent myIntent = new Intent(SenderActivity.this, ReceiverActivity.class);
myIntent.putExtra("stringVariableName", stringValue);
startActivity(myIntent);
ReceiverActivity
Intent mIntent = getIntent();
String stringValue = mIntent.getExtras().getString("stringVariableName");
oder
Intent mIntent = getIntent();
String stringValue = mIntent.getStringExtra("stringVariableName");
4. Übergeben von ArrayList-Daten:
SenderActivity
Intent myIntent = new Intent(SenderActivity.this, ReceiverActivity.class);
myIntent.putStringArrayListExtra("arrayListVariableName", arrayList);
startActivity(myIntent);
ReceiverActivity
Intent mIntent = getIntent();
arrayList = mIntent.getStringArrayListExtra("arrayListVariableName");
5. Objektdaten übergeben:
SenderActivity
Intent myIntent = new Intent(SenderActivity.this, ReceiverActivity.class);
myIntent.putExtra("ObjectVariableName", yourObject);
startActivity(myIntent);
ReceiverActivity
Intent mIntent = getIntent();
yourObj = mIntent.getSerializableExtra("ObjectVariableName");
Hinweis: Denken Sie daran, dass Ihre benutzerdefinierte Klasse die
Serializable
Schnittstelle implementieren muss.
6. HashMap-Daten <String, String> übergeben:
SenderActivity
HashMap <String, String> HashMap;
Intent mIntent = new Intent(SenderActivity.this, ReceiverActivity.class);
mIntent.putExtra("hashMap", hashMap);
startActivity(mIntent);
ReceiverActivity
Intent mIntent = getIntent();
HashMap<String, String> hashMap = (HashMap<String, String>)
mIntent.getSerializableExtra("hashMap");
7. Übergeben von Bitmap-Daten:
SenderActivity
Intent myIntent = new Intent(SenderActivity.this, ReceiverActivity.class);
myIntent.putExtra("image",bitmap);
startActivity(mIntent);
ReceiverActivity
Intent mIntent = getIntent();
Bitmap bitmap = mIntent.getParcelableExtra("image");
Anzeigen einer Dateiauswahl und Lesen des Ergebnisses
Dateiauswahl-Aktivität starten
public void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
// Update with mime types
intent.setType("*/*");
// Update with additional mime types here using a String[].
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
// Only pick openable and local files. Theoretically we could pull files from google drive
// or other applications that have networked files, but that's unnecessary for this example.
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
// REQUEST_CODE = <some-integer>
startActivityForResult(intent, REQUEST_CODE);
}
Lesen Sie das Ergebnis
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// If the user doesn't pick a file just return
if (requestCode != REQUEST_CODE || resultCode != RESULT_OK) {
return;
}
// Import the file
importFile(data.getData());
}
public void importFile(Uri uri) {
String fileName = getFileName(uri);
// The temp file could be whatever you want
File fileCopy = copyToTempFile(uri, File tempFile)
// Done!
}
/**
* Obtains the file name for a URI using content resolvers. Taken from the following link
* https://developer.android.com/training/secure-file-sharing/retrieve-info.html#RetrieveFileInfo
*
* @param uri a uri to query
* @return the file name with no path
* @throws IllegalArgumentException if the query is null, empty, or the column doesn't exist
*/
private String getFileName(Uri uri) throws IllegalArgumentException {
// Obtain a cursor with information regarding this uri
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor.getCount() <= 0) {
cursor.close();
throw new IllegalArgumentException("Can't obtain file name, cursor is empty");
}
cursor.moveToFirst();
String fileName = cursor.getString(cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME));
cursor.close();
return fileName;
}
/**
* Copies a uri reference to a temporary file
*
* @param uri the uri used as the input stream
* @param tempFile the file used as an output stream
* @return the input tempFile for convenience
* @throws IOException if an error occurs
*/
private File copyToTempFile(Uri uri, File tempFile) throws IOException {
// Obtain an input stream from the uri
InputStream inputStream = getContentResolver().openInputStream(uri);
if (inputStream == null) {
throw new IOException("Unable to obtain input stream from URI");
}
// Copy the stream to the temp file
FileUtils.copyInputStreamToFile(inputStream, tempFile);
return tempFile;
}
Benutzerdefiniertes Objekt zwischen Aktivitäten übergeben
Mit der Bundle
Klasse können Sie Ihr benutzerdefiniertes Objekt auch an andere Aktivitäten übergeben.
Es gibt zwei Möglichkeiten:
-
Serializable
Schnittstelle - für Java und Android -
Parcelable
Schnittstelle - speichereffizient, nur für Android (empfohlen)
Paketierbar
Die Verarbeitung per Paket ist viel schneller als die Serialisierung. Einer der Gründe dafür ist, dass wir den Serialisierungsprozess explizit machen, anstatt ihn anhand von Reflektionen abzuleiten. Es versteht sich auch, dass der Code für diesen Zweck stark optimiert wurde.
public class MyObjects implements Parcelable {
private int age;
private String name;
private ArrayList<String> address;
public MyObjects(String name, int age, ArrayList<String> address) {
this.name = name;
this.age = age;
this.address = address;
}
public MyObjects(Parcel source) {
age = source.readInt();
name = source.readString();
address = source.createStringArrayList();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
dest.writeStringList(address);
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public ArrayList<String> getAddress() {
if (!(address == null))
return address;
else
return new ArrayList<String>();
}
public static final Creator<MyObjects> CREATOR = new Creator<MyObjects>() {
@Override
public MyObjects[] newArray(int size) {
return new MyObjects[size];
}
@Override
public MyObjects createFromParcel(Parcel source) {
return new MyObjects(source);
}
};
}
Code zum Senden von Aktivitäten
MyObject mObject = new MyObject("name","age","Address array here");
//Passing MyOject
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObject);
startActivity(mIntent);
Empfangen des Objekts in der Zielaktivität.
//Getting MyObjects
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getParcelable("UniqueKey");
Sie können das Arraylist of Parceble-Objekt wie folgt übergeben
//Array of MyObjects
ArrayList<MyObject> mUsers;
//Passing MyObject List
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putParcelableArrayListExtra("UniqueKey", mUsers);
startActivity(mIntent);
//Getting MyObject List
Intent mIntent = getIntent();
ArrayList<MyObjects> mUsers = mIntent.getParcelableArrayList("UniqueKey");
Hinweis: Es gibt Android Studio-Plugins wie dieses , um Parcelable-Code zu generieren
Serialisierbar
Code zum Senden von Aktivitäten
Product product = new Product();
Bundle bundle = new Bundle();
bundle.putSerializable("product", product);
Intent cartIntent = new Intent(mContext, ShowCartActivity.class);
cartIntent.putExtras(bundle);
mContext.startActivity(cartIntent);
Empfangen des Objekts in der Zielaktivität.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getIntent().getExtras();
Product product = null;
if (bundle != null) {
product = (Product) bundle.getSerializable("product");
}
Arraylist
des serialisierbaren Objekts: wie beim Durchgang einzelner Objekte
Benutzerdefiniertes Objekt sollte die Serializable
Schnittstelle implementieren.
Ergebnis von Aktivität in Fragment berechnen
Wie beim Abrufen eines Ergebnisses aus einer anderen Aktivität müssen Sie die Methode startActivityForResult(Intent intent, int requestCode)
des Fragment
startActivityForResult(Intent intent, int requestCode)
. Beachten Sie, dass Sie getActivity().startActivityForResult()
nicht aufrufen getActivity().startActivityForResult()
da dies das Ergebnis zur übergeordneten Activity
des Fragment
zurückgibt.
Das Ergebnis kann mit der Fragment
onActivityResult()
. Sie müssen sicherstellen, dass die übergeordnete Activity des Fragments auch onActivityResult()
überschreibt und die Implementierung als super
.
Im folgenden Beispiel enthält ActivityOne
FragmentOne
, das ActivityTwo
startet und ein Ergebnis davon erwartet.
ActivityOne
public class ActivityOne extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one);
}
// You must override this method as the second Activity will always send its results to this Activity and then to the Fragment
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
}
activity_one.xml
<fragment android:name="com.example.FragmentOne"
android:id="@+id/fragment_one"
android:layout_width="match_parent"
android:layout_height="match_parent" />
FragmentOne
public class FragmentOne extends Fragment {
public static final int REQUEST_CODE = 11;
public static final int RESULT_CODE = 12;
public static final String EXTRA_KEY_TEST = "testKey";
// Initializing and starting the second Activity
private void startSecondActivity() {
Intent intent = new Intent(getActivity(), ActivityTwo.class);
startActivityForResult(REQUEST_CODE, intent);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_CODE) {
String testResult = data.getStringExtra(EXTRA_KEY_TEST);
// TODO: Do something with your extra data
}
}
}
AktivitätZwei
public class ActivityTwo extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
}
private void closeActivity() {
Intent intent = new Intent();
intent.putExtra(FragmentOne.EXTRA_KEY_TEST, "Testing passing data back to ActivityOne");
setResult(FragmentOne.RESULT_CODE, intent); // You can also send result without any data using setResult(int resultCode)
finish();
}
}