เปิดแอปพลิเคชันอื่นจากคุณเอง (เจตนา)


136

ฉันรู้วิธีอัปเดตโปรแกรมของตัวเองและฉันรู้วิธีเปิดโปรแกรมโดยใช้ Uri ที่กำหนดไว้ล่วงหน้า (เช่น sms หรืออีเมลเป็นต้น)

ฉันต้องทราบว่าฉันสามารถสร้างเจตจำนงเพื่อเปิด MyTracks หรือแอปพลิเคชันอื่น ๆ ที่ฉันไม่ทราบว่าพวกเขาตั้งใจฟังอะไร

ฉันได้รับข้อมูลนี้จาก DDMS แต่ฉันไม่สามารถเปลี่ยนเป็น Intent ที่ฉันสามารถใช้ได้ สิ่งนี้นำมาจากเมื่อเปิด MyTracks ด้วยตนเอง

ขอบคุณสำหรับความช่วยเหลือของคุณ

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)

คำตอบ:


141

ประการแรกแนวคิดของ "แอปพลิเคชัน" ใน Android นั้นเป็นสิ่งที่เพิ่มเติมเล็กน้อย

แอปพลิเคชัน - กระบวนการทางเทคนิค - สามารถมีกิจกรรมบริการผู้ให้บริการเนื้อหาและ / หรือผู้ฟังที่ออกอากาศหลายรายการ หากมีอย่างน้อยหนึ่งรายการกำลังทำงานแอปพลิเคชันจะเริ่มทำงาน (กระบวนการ)

ดังนั้นสิ่งที่คุณต้องระบุคือคุณต้องการ "เริ่มแอปพลิเคชัน" อย่างไร

ตกลง ... นี่คือสิ่งที่คุณสามารถลองได้:

  1. สร้างความตั้งใจด้วยaction=MAINและcategory=LAUNCHER
  2. รับPackageManagerจากบริบทปัจจุบันโดยใช้context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)ที่มีความตั้งใจcategory=LAUNCHER, action=MAINหรือpackageManager.resolveActivity(<intent>, 0)จะได้รับกิจกรรมแรกกับหลัก / ปล่อย
  4. รับสิ่งที่ActivityInfoคุณสนใจ
  5. จากActivityInfoนั้นรับpackageNameและname
  6. สุดท้ายสร้างเจตนาอื่นที่มีกับcategory=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)และsetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. สุดท้าย context.startActivity(newIntent)

จะเป็นอย่างไรถ้าฉันต้องการเปิดแอปสามแอปแยกกัน
Si8

7
คำตอบของวิกิชุมชนจะดีกว่าถ้าคุณรู้ชื่อแพคเกจstackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk

คุณจะส่งผ่านข้อมูลระหว่างแอพที่โทรและแอพที่เปิดตัวได้อย่างไร? ฉันพบ 'Intent.putExtra ()' แต่ฉันไม่รู้วิธีเรียกข้อมูลเพิ่มเติมในแอปที่เปิดตัว
Bram

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

2
getPackageManager().getLaunchIntentForPackage()ทำทุกอย่างให้คุณแล้ว github.com/android/platform_frameworks_base/blob/master/core/…
jrub

231

ฉันมีงานอย่างนี้

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

ตัวอย่างการใช้งาน:

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

หวังว่าจะช่วยใครซักคน


5
เนื่องจาก getLaunchIntentForPackage ("ชื่อแพ็คเกจแอป") อาจทำให้เกิดข้อยกเว้น
xtr

นี่คือคำตอบที่ยอดเยี่ยมจับข้อยกเว้นง่าย ๆ และทำสิ่งที่คุณต้องการแจ้งผู้ใช้และอื่น ๆ
IT-Dan

5
ไม่ใช่เป็นตัวติด แต่ไม่มีเหตุผลที่จะจัดสรร Intent ใหม่ในบรรทัดแรกเนื่องจากคุณใช้ผลลัพธ์ของการgetLaunchIntentForPackageโทร
Chris Lacy

2
getLaunchIntentForPackage()เพิ่มหมวดหมู่แล้วดูแหล่งที่มา: 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);

แก้ไข:

ตามที่แนะนำในความคิดเห็นให้เพิ่มหนึ่งบรรทัดก่อน startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
แต่ต้องทราบชื่อของกิจกรรม
njzk2

ฉันลองและได้รับข้อผิดพลาดแนะนำให้ใช้การตั้งค่าสถานะ FLAG_ACTIVITY_NEW_TASK ฉันเพิ่มบรรทัดนี้ก่อน startActivity และใช้งานได้: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze

1
@ njzk2 การค้นหาชื่อแพ็คเกจสำหรับบางสิ่งบน Google Play นั้นง่าย มันอยู่ตรงนั้นใน URL ตัวอย่างเช่น: play.google.com/store/apps/…
Da-Jin

@iceybobby ใช่ชื่อแพคเกจหาง่าย แต่คุณจะหาชื่อคลาสของกิจกรรมที่จะเปิดได้อย่างไร
phreakhead

@ phreakhead คุณพูดถูก ฉันคิดว่าฉันใช้วิธีแก้ปัญหาในคำตอบนี้: stackoverflow.com/a/8944286/1224186ดังนั้นจึงไม่จำเป็นต้องใช้ชื่อกิจกรรมดังนั้นฉันคิดว่านั่นทำให้การตอบกลับของฉันไปที่ njzk2 ไม่เป็นประโยชน์ที่นี่
Da-Jin

39

หากคุณมีชื่อแพคเกจที่คุณต้องการเปิดใช้งานคุณสามารถใช้รหัสต่อไปนี้ซึ่งเป็นชื่อสามัญมากขึ้น:

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

ฉันพบว่ามันทำงานได้ดีขึ้นสำหรับกรณีที่ไม่พบกิจกรรมหลักโดยวิธีปกติในการเริ่มกิจกรรมหลัก


คำตอบที่ดีที่สุดสำหรับฉัน :-) มีประโยชน์สำหรับฉัน ขอบคุณ
Jalpesh Khakhi

มันเหมาะสำหรับฉัน ขอบคุณมาก Muzikant:)
อเล็กซ์

13

นี่คือรหัสของโซลูชันของฉันบนโซลูชัน MasterGaurav:

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

การใช้โซลูชันจากผู้บุกรุกฉันได้ขยายตัวอย่างด้วยฟังก์ชั่นซึ่งจะถูกเรียกเมื่อแอปพลิเคชันที่ต้องการไม่ได้ติดตั้งในขณะนี้ ดังนั้นจึงทำงานเหมือน: เรียกใช้แอปพลิเคชันด้วยชื่อแพ็คเกจ หากไม่พบให้เปิดตลาด Android - 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);
}

และมันถูกใช้แบบนี้:

startApplication("org.teepee.bazant");

6

ใช้สิ่งนี้:

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

มีความคิดใด ๆ เปิด test.apk แทนที่จะติดตั้งในร้านอุปกรณ์ในแอพพลิเคชั่นที่มีอยู่ คำแนะนำเมื่อคลิกปุ่มทดสอบกลางวันแอปพลิเคชันที่เก็บไว้ในโครงการที่มีอยู่ ขอบคุณล่วงหน้า.
Selim Raza

6

เปิดแอปพลิเคชันหากมีอยู่หรือเปิดแอปพลิเคชัน Play Store เพื่อติดตั้ง:

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

ควรเป็นถ้า (i! = null)
vallllll

4

เพื่อเริ่มกิจกรรมแอปพลิเคชันอื่นจากกิจกรรมแอปพลิเคชันของฉัน มันทำงานได้ดีสำหรับฉัน

รหัสด้านล่างจะใช้งานได้หากแอปพลิเคชั่นอื่นติดตั้งอยู่ในโทรศัพท์ของคุณไม่เช่นนั้นจะไม่สามารถเปลี่ยนเส้นทางจากแอปหนึ่งไปยังแอปอื่นได้

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

โปรดอย่าเขียนคำตอบหลายคำที่เกือบเหมือนคำถามเดียวกัน ใช้ลิงค์ "แก้ไข" ด้านล่างคำตอบและเปลี่ยนต้นฉบับ
AdrianHHH

3

// สิ่งนี้ใช้ได้กับ 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;
}

2

เนื่องจากแอปพลิเคชันไม่ได้รับอนุญาตให้เปลี่ยนการตั้งค่าโทรศัพท์จำนวนมากคุณสามารถเปิดกิจกรรมการตั้งค่าเหมือนกับแอปพลิเคชันอื่น

ดูผลลัพธ์ LogCat ของคุณหลังจากที่คุณแก้ไขการตั้งค่าด้วยตนเองจริง:

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

จากนั้นใช้สิ่งนี้เพื่อแสดงหน้าการตั้งค่าจากแอพของคุณ:

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 ระดับ 3+ จะไม่มีโค้ดมากกว่าหนึ่งบรรทัด:

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

ส่งคืน CATEGORY_INFO เรียกใช้การแสดงเจตนา (แอพที่ไม่มีกิจกรรมของตัวเรียกใช้, รูปพื้นหลังมักใช้สิ่งนี้เพื่อให้ข้อมูลเกี่ยวกับแอป) และหากไม่พบให้ส่งคืน CATEGORY_LAUNCH ของแพคเกจหากมีอยู่


2

หากคุณพยายามที่จะเริ่มต้นบริการมากกว่ากิจกรรมนี่ใช้งานได้สำหรับฉัน:

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

หากคุณใช้วิธีการของ


2

หรือคุณสามารถเปิดความตั้งใจจากแอพของคุณในแอพอื่นด้วย:

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

urideeplink อยู่ที่ไหนกับแอพอื่น


2

ใช้ดังต่อไปนี้:

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

2

เปิดแอปพลิเคชันจากแอปพลิเคชันอื่นบน Android

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

2

หากคุณต้องการเปิดแอปพลิเคชันอื่นและไม่ได้ติดตั้งคุณสามารถส่งไปที่ Google App Store เพื่อดาวน์โหลด

  1. ขั้นแรกให้สร้างวิธี openOtherApp เช่น

    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.- การใช้งาน

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

0

ลองใช้รหัสนี้หวังว่าจะช่วยคุณได้ หากแพคเกจนี้สามารถใช้งานได้สิ่งนี้จะเปิดแอปหรือเปิด play store สำหรับดาวน์โหลด

    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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.