Ich weiß, wie ich meine eigenen Programme aktualisiere, und ich kann Programme mit einem vordefinierten Uri öffnen (z. B. für SMS oder E-Mail).
Ich muss wissen, wie ich eine Absicht erstellen kann, um MyTracks oder eine andere Anwendung zu öffnen, von der ich nicht weiß, welche Absicht sie hören.
Ich habe diese Informationen von DDMS erhalten, aber es ist mir nicht gelungen, diese Absicht in eine Absicht umzuwandeln, die ich verwenden kann. Dies wird beim manuellen Öffnen von MyTracks übernommen.
Danke für Ihre Hilfe
05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent { act=Android.intent.action.MAIN cat=[Android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.Android.maps.mytracks/com.google.Android.apps.mytracks.MyTracks bnds=[243,338][317,417] }
05-06 11:22:25.005: INFO/ActivityManager(76): Start proc com.google.Android.maps.mytracks for activity com.google.Android.maps.mytracks/com.google.Android.apps.mytracks.MyTracks: pid=1176 uid=10063 gids={3003, 1015}
05-06 11:22:26.995: INFO/ActivityManager(76): Displayed activity com.google.Android.maps.mytracks/com.google.Android.apps.mytracks.MyTracks: 1996 ms (total 1996 ms)
Erstens ist das Konzept der "Anwendung" in Android etwas erweitert.
Eine Anwendung - technisch ein Prozess - kann mehrere Aktivitäten, Dienste, Inhaltsanbieter und/oder Broadcast-Listener haben. Wenn mindestens einer von ihnen ausgeführt wird, ist die Anwendung in Betrieb (der Prozess).
Was Sie also identifizieren müssen, ist, wie Sie die Anwendung "starten" möchten.
Ok ... Folgendes kannst du ausprobieren:
action=MAIN
und category=LAUNCHER
PackageManager
aus dem aktuellen Kontext mit context.getPackageManager
ab.packageManager.queryIntentActivity(<intent>, 0)
wo die Absicht category=LAUNCHER
, action=MAIN
oder packageManager.resolveActivity(<intent>, 0)
ist, um die erste Aktivität mit main/launcher abzurufenActivityInfo
, an dem Sie interessiert sindActivityInfo
die packageName
und name
ab.category=LAUNCHER
, action=MAIN
, componentName = new ComponentName(packageName, name)
und setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(newIntent)
Ich habe es so gemacht,
/** Open another app.
* @param context current Context, like Activity, App, or Service
* @param packageName the full package name of the app to open
* @return true if likely successful, false if unsuccessful
*/
public static boolean openApp(Context context, String packageName) {
PackageManager manager = context.getPackageManager();
try {
Intent i = manager.getLaunchIntentForPackage(packageName);
if (i == null) {
return false;
//throw new ActivityNotFoundException();
}
i.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(i);
return true;
} catch (ActivityNotFoundException e) {
return false;
}
}
Verwendungsbeispiel:
openApp(this, "com.google.Android.maps.mytracks");
Hoffe es hilft jemandem.
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString("com.google.Android.maps.mytracks/com.google.Android.apps.mytracks.MyTracks"));
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
BEARBEITEN:
wie in Kommentaren vorgeschlagen, fügen Sie eine Zeile vor startActivity(intent);
ein.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Wenn Sie bereits den Paketnamen haben, den Sie aktivieren möchten, können Sie den folgenden Code verwenden, der etwas generischer ist:
PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
context.startActivity(appStartIntent);
}
Ich habe festgestellt, dass es besser für Fälle funktioniert, in denen die Hauptaktivität nicht mit der regulären Methode zum Starten der MAIN-Aktivität gefunden wurde.
Dies ist der Code meiner Lösung, die auf der MasterGaurav-Lösung basiert:
private void launchComponent(String packageName, String name){
Intent launch_intent = new Intent("Android.intent.action.MAIN");
launch_intent.addCategory("Android.intent.category.LAUNCHER");
launch_intent.setComponent(new ComponentName(packageName, name));
launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(launch_intent);
}
public void startApplication(String application_name){
try{
Intent intent = new Intent("Android.intent.action.MAIN");
intent.addCategory("Android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveinfo_list = activity.getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info:resolveinfo_list){
if(info.activityInfo.packageName.equalsIgnoreCase(application_name)){
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
break;
}
}
}
catch (ActivityNotFoundException e) {
Toast.makeText(activity.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
}
}
Mit der Lösung von inversus habe ich das Snippet um eine Funktion erweitert, die aufgerufen wird, wenn die gewünschte Anwendung momentan nicht installiert ist. Es funktioniert also wie folgt: Anwendung nach Paketnamen ausführen. Wenn nicht gefunden, öffnen Sie den Android Market - Google Play für dieses Paket .
public void startApplication(String packageName)
{
try
{
Intent intent = new Intent("Android.intent.action.MAIN");
intent.addCategory("Android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info : resolveInfoList)
if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
{
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
return;
}
// No match, so application is not installed
showInMarket(packageName);
}
catch (Exception e)
{
showInMarket(packageName);
}
}
private void launchComponent(String packageName, String name)
{
Intent intent = new Intent("Android.intent.action.MAIN");
intent.addCategory("Android.intent.category.LAUNCHER");
intent.setComponent(new ComponentName(packageName, name));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
private void showInMarket(String packageName)
{
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
Und es wird so verwendet:
startApplication("org.teepee.bazant");
Öffnen Sie die Anwendung, falls vorhanden, oder öffnen Sie die Play Store-Anwendung, um sie zu installieren:
private void open() {
openApplication(getActivity(), "com.app.package.here");
}
public void openApplication(Context context, String packageN) {
Intent i = context.getPackageManager().getLaunchIntentForPackage(packageN);
if (i != null) {
i.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(i);
} else {
try {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
}
catch (Android.content.ActivityNotFoundException anfe) {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
}
}
}
Benutze das :
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage("com.package.name");
startActivity(intent);
So starten Sie eine andere Anwendungsaktivität aus meiner Anwendungsaktivität. Es funktioniert gut für mich.
Der folgende Code funktioniert, wenn eine andere Anwendung bereits auf Ihrem Telefon installiert ist. Andernfalls ist es nicht möglich, eine App an eine andere App weiterzuleiten. Stellen Sie sicher, dass Ihre App gestartet wurde oder nicht.
Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
// Das funktioniert auf Android Lollipop 5.0.2
public static boolean launchApp(Context context, String packageName) {
final PackageManager manager = context.getPackageManager();
final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN);
appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0);
if ((null != resolveInfos) && (!resolveInfos.isEmpty())) {
for (ResolveInfo rInfo : resolveInfos) {
String className = rInfo.activityInfo.name.trim();
String targetPackageName = rInfo.activityInfo.packageName.trim();
Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName);
if (packageName.trim().equals(targetPackageName)) {
Intent intent = new Intent();
intent.setClassName(targetPackageName, className);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Log.d("AppsLauncher", "Launching Package '" + packageName + "' with Activity '" + className + "'");
return true;
}
}
}
return false;
}
Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
startActivity(launchIntent);
Für API-Level 3+ nicht mehr als eine Codezeile:
Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");
Einen Intent-Start von CATEGORY_INFO zurückgeben (Apps ohne Launcher-Aktivität, z. B. Hintergrundbilder, geben häufig Informationen zur App an) und geben, falls vorhanden, das Paket CATEGORY_LAUNCH des Pakets zurück, falls vorhanden.
Alternativ können Sie die Absicht auch von Ihrer App aus in der anderen App öffnen mit:
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
wobei uri
der Deeplink zur anderen App ist
Verwenden Sie folgendes:
String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
Wenn Sie versuchen, einen SERVICE und nicht eine Aktivität zu starten, hat dies für mich funktioniert:
Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);
Wenn Sie die Methode intent.setComponent (...) wie in anderen Antworten erwähnt verwenden, wird möglicherweise die Warnung "Implizite Absichten mit startService sind nicht sicher" angezeigt.
Da Anwendungen viele Telefoneinstellungen nicht ändern dürfen, können Sie eine Einstellungsaktivität wie eine andere Anwendung öffnen.
Sehen Sie sich Ihre LogCat-Ausgabe an, nachdem Sie die Einstellung manuell geändert haben:
INFO/ActivityManager(1306): Starting activity: Intent { act=Android.intent.action.MAIN cmp=com.Android.settings/.DevelopmentSettings } from pid 1924
Verwenden Sie dann diese Option, um die Einstellungsseite Ihrer App anzuzeigen:
String SettingsPage = "com.Android.settings/.DevelopmentSettings";
try
{
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString(SettingsPage));
intent.addCategory(Intent.CATEGORY_LAUNCHER );
startActivity(intent);
}
catch (ActivityNotFoundException e)
{
log it
}
Wenn Sie eine andere Anwendung öffnen möchten und diese nicht installiert ist, können Sie sie zum Herunterladen an den Google App Store senden
Erstellen Sie zunächst beispielsweise die Methode openOtherApp
public static boolean openApp(Context context, String packageName) {
PackageManager manager = context.getPackageManager();
try {
Intent intent = manager.getLaunchIntentForPackage(packageName);
if (intent == null) {
//the app is not installed
try {
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + packageName));
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
//throw new ActivityNotFoundException();
return false;
}
}
intent.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(intent);
return true;
} catch (ActivityNotFoundException e) {
return false;
}
}
2. Verwendung
openOtherApp(getApplicationContext(), "com.packageappname");
Mit diesem Befehl können Sie die auf einem Gerät installierten Paketnamen suchen:
adb Shell pm list packages -3 -f
Referenz: http://www.aftvnews.com/wie-zu-bestimmen-des-paketname-von-an-Android-app/
Versuchen Sie es mit diesem Code. Wenn dieses Paket verfügbar ist, wird die App oder der Play Store zum Herunterladen geöffnet
String packageN = "aman4india.com.pincodedirectory";
Intent i = getPackageManager().getLaunchIntentForPackage(packageN);
if (i != null) {
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
} else {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
}
catch (Android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
}
}