Kendinizden başka bir uygulama açın (niyetiniz)


136

Kendi programlarımı nasıl güncelleyeceğimi biliyorum ve önceden tanımlanmış bir Uri kullanarak programları nasıl açacağımı biliyorum (örneğin sms veya e-posta için)

MyTracks'ı veya hangi niyetleri dinlediklerini bilmediğim başka bir uygulamayı açmak için bir Niyet oluşturabileceğimi bilmem gerekiyor.

Bu bilgiyi DDMS'den aldım, ancak bunu kullanabileceğim bir Niyet'e dönüştürmede başarılı olamadım. Bu, MyTracks'ı manuel olarak açarken alınır.

Yardımınız için teşekkürler

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)

Yanıtlar:


141

İlk olarak, Android "uygulama" kavramı biraz genişletilmiş bir kavramdır.

Bir uygulama - teknik olarak bir süreç - birden fazla etkinliğe, hizmete, içerik sağlayıcısına ve / veya yayın dinleyicisine sahip olabilir. Bunlardan en az biri çalışıyorsa, uygulama çalışır durumdadır (işlem).

Yani, tanımlamanız gereken şey "uygulamayı nasıl başlatmak" istediğinizdir.

Tamam ... deneyebileceğiniz şeyler:

  1. action=MAINVe ile bir niyet oluşturuncategory=LAUNCHER
  2. PackageManagerKullanarak mevcut bağlamdan alıncontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)niyet sahip olduğu category=LAUNCHER, action=MAINya da packageManager.resolveActivity(<intent>, 0)ana / fırlatıcı ile ilk etkinliğini almak için
  4. ActivityInfoİlgilendiğiniz şeyi edinin
  5. Dan ActivityInfo, almak packageNamevename
  6. Son olarak, birlikte başka niyet oluşturmak category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)vesetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. En sonunda, context.startActivity(newIntent)

Üç ayrı uygulama açmak istersem ne olur?
Si8


Arayan uygulama ile başlatılan uygulama arasında nasıl veri aktarabilirsiniz? 'Intent.putExtra ()' buldum ama başlatılan app ekstra veri almak için nasıl bilmiyorum.
Bram

onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }vb
Gaurav Vaish

2
getPackageManager().getLaunchIntentForPackage()zaten tüm bunları sizin için yapıyor github.com/android/platform_frameworks_base/blob/master/core/…
jrub

231

Bunun gibi işlerim var,

/** 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;
    }
}

Örnek kullanım:

openApp(this, "com.google.android.maps.mytracks");

Umarım birine yardımcı olur.


5
çünkü getLaunchIntentForPackage ("uygulama paketi adı") istisnaya neden olabilir.
xtr

Bu harika bir cevap, basit bir istisna yakalamak ve ihtiyacınız olanı yapmak, kullanıcıyı bilgilendirmek vb.
IT-Dan

5
Yapışkan olmamak, ancak getLaunchIntentForPackageçağrının sonucunu kullandığınızda, ilk hatta yeni bir Amaç tahsis etmek için bir neden yoktur .
Chris Lacy

2
getLaunchIntentForPackage()zaten kategoriyi ekliyor, bkz. kaynak: github.com/android/platform_frameworks_base/blob/master/core/…
jrub

96
    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);

DÜZENLE :

yorumlarda önerildiği gibi, önce bir satır ekleyin startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
ancak etkinliğin adını bilmeyi gerektirir
njzk2 18:11

Bunu denedim ve FLAG_ACTIVITY_NEW_TASK bayrağını kullanmanızı tavsiye eden bir hata aldım. Bu satırı startActivity'den önce ekledim ve çalıştı: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze

1
@ njzk2 Google Play'de bir şey için paket adını bulmak kolaydır; tam URL'de. Örneğin: play.google.com/store/apps/…
Da-Jin

@iceybobby evet paket adının bulunması kolaydır, ancak başlatılacak etkinliğin sınıf adını nasıl bulursunuz?
phreakhead

@phreakhead Haklısın. Ben bu cevapta çözüm kullandığımı düşünüyorum: stackoverflow.com/a/8944286/1224186 böylece etkinlik adı gerekli değildi, ve bu yüzden njzk2 benim cevap burada yararsız yapar düşünüyorum.
Da-Jin

39

Etkinleştirmek istediğiniz paket adına zaten sahipseniz, biraz daha genel olan aşağıdaki kodu kullanabilirsiniz:

PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
    context.startActivity(appStartIntent);
}

Ana faaliyetin düzenli olarak ANA faaliyete başlama yöntemi ile bulunmadığı durumlarda daha iyi çalıştığını buldum.


Benim için en iyi cevap :-) benim için yararlı. Teşekkürler
Jalpesh Khakhi

Benim için mükemmel. Çok teşekkürler Muzikant :)
Alex

13

Bu MasterGaurav çözüm benim çözüm tabanı kodu:

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();
    }
}

10

İnversustan gelen çözümü kullanarak, snippet'i, istenen uygulama şu anda yüklenmediğinde çağrılacak bir işlevle genişlettim. Yani şu şekilde çalışır: Uygulamayı paket adına göre çalıştırın. Bulunamazsa, Android pazarını açın - Bu paket için Google play .

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);
}

Ve şu şekilde kullanılır:

startApplication("org.teepee.bazant");

6

Bunu kullan :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);

Bir fikrin var mı? varolan uygulamanın içindeki aygıt deposuna yüklemek yerine bir test.apk açın. bir düğme öğle test.apk varolan projede depolanan uygulamalar tıkladığında ipuçları. şimdiden teşekkürler.
Selim Raza

6

Varsa uygulamayı açın veya yüklemek için Play Store uygulamasını açın:

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)));
        }
    }
}

olmalıdır (i! = null)
vallllll

4

Uygulama Etkinliğimden başka bir uygulama etkinliği başlatmak için. Benim için iyi çalışıyor.

Telefonunuzda başka bir uygulama zaten yüklüyse aşağıdaki kod çalışacaktır, aksi takdirde bir uygulamayı başka bir uygulamaya yönlendirmek mümkün değildir.

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);

Lütfen aynı soru ile neredeyse aynı olan birden fazla cevap yazmayın. Cevabın altındaki "düzenle" bağlantısını kullanın ve orijinali değiştirin.
AdrianHHH

3

// Bu Android Lollipop 5.0.2'de çalışıyor

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;
}

2

Uygulamaların telefon ayarlarının çoğunu değiştirmesine izin verilmediğinden, başka bir uygulama gibi bir ayar etkinliği açabilirsiniz.

Ayarı manuel olarak değiştirdikten sonra LogCat çıktısına bakın:

INFO/ActivityManager(1306): Starting activity: Intent { act=android.intent.action.MAIN cmp=com.android.settings/.DevelopmentSettings } from pid 1924

Ardından, uygulamanızdan ayarlar sayfasını görüntülemek için bunu kullanın:

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
}

2

API düzeyi 3+ için, bir kod satırından başka bir şey yoktur:

Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");

Bir CATEGORY_INFO başlatma Hedefi döndürme (başlatıcı etkinliği olmayan uygulamalar, örneğin duvar kağıtları, genellikle uygulama hakkında bazı bilgiler sağlamak için bunu kullanır) ve bulamazsa, paketin CATEGORY_LAUNCH'ını döndürür.


2

Etkinlik yerine bir SERVİS başlatmaya çalışıyorsanız, bu benim için çalıştı:

Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);

Diğer yanıtlarda belirtildiği gibi intent.setComponent (...) yöntemini kullanırsanız, "startService ile örtük niyetler güvenli değildir" uyarısı alabilirsiniz.


2

Alternatif olarak, diğer uygulamada uygulamanızın amacını aşağıdakilerle de açabilirsiniz:

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

uridiğer uygulamaya derin bağlantı nerede


2

Aşağıdakileri kullanın:

String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));

2

Android'de başka bir uygulamadan uygulama başlatma

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);

2

Başka bir uygulama açmak istiyorsanız ve yüklü değilse indirmek için Google App Store'a gönderebilirsiniz

  1. Öncelikle, örneğin openOtherApp yöntemini oluşturun

    public static boolean openOtherApp(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.- Kullanım

openOtherApp(getApplicationContext(), "com.packageappname");

0

Bu kodu deneyin, Umarım bu size yardımcı olacaktır. Bu paket mevcutsa, bu uygulamayı açar veya indirme için play store'u açar

    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)));
                }
            }


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
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.