Navigieren zwischen Activities mit Intents
Von der Haupt-Activity zu einer anderen Activity springen
Verwenden Sie einen expliziten Intent.
Wir fügen eine leere Activity hinzu und nennen sie AddCourseActivity. Dabei setzen wir einen Haken bei „Generate Layout File“.
Aktivieren Sie jedoch nicht die Option „Launcher Activity“.
Intent
Ein Intent ist ein wichtiges Mittel für die Interaktion zwischen Komponenten in einer Android-App.
Er kann nicht nur die Aktion angeben, die die aktuelle Komponente ausführen soll, sondern auch Daten zwischen Komponenten übergeben.
Intents werden unterteilt in: Explizite Intents und Implizite Intents
Er hat mehrere Konstruktoren.
Auf einem Button in der Haupt-Activity instanziiere ich einen Intent, um von der Haupt-Activity zur zweiten Activity zu springen.
// Zuerst einen Intent initialisieren und angeben, von wo nach wo
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
startActivity(it);Code-Sprache: JavaScript (javascript)
Verwendung impliziter Intents
Im Vergleich zu expliziten Intents muss bei impliziten Intents nicht angegeben werden, welche Activity gestartet wird. Stattdessen werden abstraktere Actions und Categories angegeben.
Das System analysiert dann diesen Intent und hilft uns, eine gültige Activity zum Starten zu finden.
Wir ändern die AndroidManifest.xml.
Fügen Sie der zweiten Activity eine Action und eine Category hinzu.
Bei der Action geben wir an, dass diese Activity auf diese Action reagieren kann.
<activity android:name=".AddCourseActivity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>Code-Sprache: HTML, XML (xml)
Nur wenn der Intent mit der Action und der Category der Activity übereinstimmt, kann die Activity auf den Intent reagieren.
// Intent initialisieren, um mit der entsprechenden Action in AndroidManifest.xml abzugleichen
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
startActivity(it);Code-Sprache: JavaScript (javascript)
Warum müssen wir die Category nicht abgleichen?
Weil diese Activity android.intent.category.DEFAULT verwendet.
Das ist der Standardwert.
Wenn wir startActivity aufrufen, wird DEFAULT automatisch übergeben.
Jeder Intent kann nur eine Action, aber mehrere Categories angeben.
Da es derzeit DEFAULT ist, müssen wir es nicht hinzufügen.
Wenn wir andere Categories hinzufügen müssen:
// Intent initialisieren, um mit der Action abzugleichen, und Categories hinzufügen
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY1111111");
startActivity(it);Code-Sprache: JavaScript (javascript)
Beim Klicken auf das Menü „Kurs hinzufügen“ ist die App abgestürzt.
Der Grund ist, dass wir dem Intent eine Category hinzugefügt haben, die zweite Activity diese Category aber nicht deklariert.
Wir müssen diese Category also hinzufügen.
<activity android:name=".AddCourseActivity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
</intent-filter>
</activity>Code-Sprache: HTML, XML (xml)
Hinweis:
Wenn ein Intent mehrere Categories hat, bedeutet das nicht, dass eine Übereinstimmung genügt; alle Categories müssen übereinstimmen.
<activity android:name=".AddCourseActivity">
<intent-filter>
<action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
</intent-filter>
</activity>Code-Sprache: HTML, XML (xml)
case R.id.add:
// Intent initialisieren, um mit der Action abzugleichen, und Categories hinzufügen
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY2222222");
//it.addCategory("android.intent.category.DEFAULT");
startActivity(it);
break;Code-Sprache: JavaScript (javascript)
Webseite mit implizitem Intent öffnen
Implizite Intents können noch viel mehr.
Sie können nicht nur Activities innerhalb derselben App starten, sondern auch Activities anderer Apps.
Dadurch wird die gemeinsame Nutzung von Funktionen über mehrere Apps hinweg möglich.
Zum Beispiel, wenn ein Freund Ihnen in WeChat eine Adresse schickt, können Sie sie mit dem QQ-Browser öffnen.
Probieren wir es hier aus:
Intent it = new Intent(Intent.ACTION_VIEW); // Systeminterne Action
it.setData(Uri.parse("http://www.foxdevelop.com")); // Eine URL öffnen
startActivity(it);Code-Sprache: JavaScript (javascript)
Das „http://“ darf nicht fehlen, sonst kommt es zu einem Fehler.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.foxdevelop.www.activitydemo, PID: 8917
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.foxdevelop.com }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
at android.app.Activity.startActivityForResult(Activity.java:4224)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)Code-Sprache: PHP (php)
Telefonieren mit implizitem Intent
Sie können das tel-Protokoll verwenden, um anzurufen
Im letzten Kurs haben wir das http-Protokoll verwendet, um eine Domain zu öffnen.
Versuchen wir zum Beispiel, 10010 anzurufen.

Intent it = new Intent(Intent.ACTION_DIAL); // Systeminterne Action
it.setData(Uri.parse("tel:10010")); // Diese Nummer wählen; Benutzerbestätigung erforderlich
startActivity(it);Code-Sprache: JavaScript (javascript)
Daten zwischen Activities übergeben
Intents können Daten übergeben
intent (Substantiv): Absicht, Vorsatz; Bedeutung, Sinn.
Verwenden Sie seine putExtra-Methode, um Daten zu übergeben.
In der zweiten Activity können Sie dann durch Aufrufen der Methode getStringExtra die übergebenen Daten abrufen.
In der zweiten Activity können Sie getIntent aufrufen, um den Intent zu erhalten.
Wenn Sie eine Ganzzahl übergeben, können Sie getIntExtra verwenden, um sie zu erhalten.
Zuerst in der ersten Activity:
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
startActivity(it);Code-Sprache: JavaScript (javascript)
Dann in der zweiten Activity das Intent-Objekt abrufen und seine Werte auslesen.
In der onCreate-Methode der zweiten Activity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course_acticity);
Intent it = getIntent();
String site = it.getStringExtra("site");
String name = it.getStringExtra("name");
int version = it.getIntExtra("version", 1);
Log.e(TAG, site);
}Code-Sprache: JavaScript (javascript)
Daten an die vorherige Activity zurückgeben
Wenn wir die aktuelle Activity beenden
Activities verfügen über eine Methode namens startActivityForResult, die vor der Zerstörung der Activity ein Ergebnis an die vorherige Activity zurückgeben kann.
Diese Methode nimmt zwei Parameter entgegen: Der erste ist der Intent, der zweite ist der Anfragecode, der im Callback später zur Bestimmung der Datenquelle verwendet wird.
Vor der Zerstörung der Activity können Sie mit der Methode setResult ein Ergebnis an die vorherige Activity zurückgeben. Üblicherweise werden RESULT_OK oder RESULT_CANCELED verwendet. Der zweite Parameter ist der Intent, der die Daten enthält.
Sie können putExtra verwenden, um Werte für den Intent zu setzen.
Da wir in der vorherigen Activity startActivityForResult verwendet haben, um die zweite Activity zu starten, wird beim Zerstören der zweiten Activity die onActivityResult-Methode der ersten Activity ausgelöst. Hier können wir den Intent und den Ergebniscode abrufen.
Wenn der Benutzer nicht auf eine Schaltfläche klickt, um zurückzukehren, sondern die Zurück-Taste verwendet, müssen wir in der zweiten Activity die Methode onBackPressed überschreiben.
1. Beim Starten des Intents in der ersten Activity
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
it.putExtra("version", 1);
startActivityForResult(it, 1);Code-Sprache: JavaScript (javascript)
2. Überschreiben in der ersten Activity
public class FirstActivity extends AppCompatActivity {
private static final String TAG = "FirstActivity";
// Methode der ersten Activity überschreiben; wenn die zweite Activity beendet wird, wird dieser Code ausgeführt
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
String h = data.getStringExtra("hot");
Log.d(TAG, h);
}
super.onActivityResult(requestCode, resultCode, data);
}Code-Sprache: JavaScript (javascript)
3. In der zweiten Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course_acticity);
// Daten der vorherigen Activity abrufen
Intent it = getIntent();
String site = it.getStringExtra("site");
String name = it.getStringExtra("name");
int version = it.getIntExtra("version", 1);
Log.e(TAG, site);
// Zurück-Event zum Button hinzufügen, Intent-Werte im Event setzen, Ergebniscode setzen und beenden
Button b = findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent it = getIntent();
it.putExtra("hot", "Beliebte Kurse");
setResult(RESULT_OK, it);
finish();
}
});
}Code-Sprache: JavaScript (javascript)
Wenn wir zur Haupt-Activity zurückkehren, wird das Event ausgelöst und das Protokoll ausgegeben.
05-12 06:17:46.741 12960-12960/com.foxdevelop.www.activitydemo D/FirstActivity: Beliebte Kurse
Wenn auch die Zurück-Taste Daten zurückgeben soll
Müssen Sie onBackPressed überschreiben.
Wir überschreiben dies in der zweiten Activity:
// Diese Methode wird ausgelöst, wenn wir die Zurück-Taste drücken
@Override
public void onBackPressed() {
Intent it = getIntent();
it.putExtra("hot", "Neueste Kurse");
setResult(RESULT_OK, it);
finish();
}Code-Sprache: JavaScript (javascript)
05-12 06:23:08.654 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Beliebte Kurse
05-12 06:23:16.405 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Neueste Kurse
05-12 06:23:35.612 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Neueste Kurse