Mở một ứng dụng khác từ (ý định) của riêng bạn


136

Tôi biết cách cập nhật các chương trình của riêng mình và tôi biết cách mở các chương trình bằng cách sử dụng Uri được xác định trước (ví dụ như tin nhắn hoặc email)

Tôi cần biết làm thế nào tôi có thể tạo một Ý định để mở MyTracks hoặc bất kỳ ứng dụng nào khác mà tôi không biết họ nghe ý định gì.

Tôi đã nhận được thông tin này từ DDMS, nhưng tôi đã không thành công trong việc biến thông tin này thành Ý định mà tôi có thể sử dụng. Điều này được lấy từ khi mở MyTracks bằng tay.

Cảm ơn bạn đã giúp đỡ

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)

Câu trả lời:


141

Thứ nhất, khái niệm "ứng dụng" trong Android hơi mở rộng.

Một ứng dụng - về mặt kỹ thuật là một quy trình - có thể có nhiều hoạt động, dịch vụ, nhà cung cấp nội dung và / hoặc người nghe phát sóng. Nếu ít nhất một trong số họ đang chạy, ứng dụng sẽ hoạt động (quá trình).

Vì vậy, những gì bạn phải xác định là làm thế nào bạn muốn "khởi động ứng dụng".

Ok ... đây là những gì bạn có thể thử:

  1. Tạo một ý định với action=MAINcategory=LAUNCHER
  2. Lấy PackageManagertừ bối cảnh hiện tại bằng cách sử dụngcontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)nơi ý có category=LAUNCHER, action=MAINhoặc packageManager.resolveActivity(<intent>, 0)để có được những hoạt động đầu tiên với chính / launcher
  4. Thu hút sự ActivityInfoquan tâm của bạn
  5. Từ ActivityInfo, nhận được packageNamename
  6. Cuối cùng, tạo ra một ý định với với category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Cuối cùng, context.startActivity(newIntent)

Nếu tôi muốn mở ba ứng dụng riêng biệt thì sao?
Si8

7
Câu trả lời wiki cộng đồng dưới đây là tốt hơn, nếu bạn biết tên gói stackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk

Làm thế nào bạn có thể truyền dữ liệu giữa ứng dụng gọi điện và ứng dụng đã khởi chạy? Tôi đã tìm thấy 'Intent.putExtra ()' nhưng tôi không biết cách truy xuất dữ liệu bổ sung trong ứng dụng đã khởi chạy.
Bram

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

2
getPackageManager().getLaunchIntentForPackage()đã làm tất cả những điều đó cho bạn github.com/android/pl
platform_frameworks_base/blob/master/core/ mẹo

231

Tôi có công việc như thế này,

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

Ví dụ sử dụng:

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

Hy vọng nó sẽ giúp được ai đó.


5
bởi vì getLaunchIntentForPackage ("tên gói ứng dụng") có thể gây ra ngoại lệ.
xtr

Đây là một câu trả lời tuyệt vời, đơn giản là bắt ngoại lệ và làm những gì bạn cần, thông báo cho người dùng, v.v.
IT-Dan

5
Không phải là một stickler, nhưng không có lý do gì để phân bổ một Ý định mới trên dòng đầu tiên khi bạn sử dụng kết quả của getLaunchIntentForPackagecuộc gọi.
Chris Lacy

2
getLaunchIntentForPackage()đã thêm danh mục, xem nguồn: github.com/android/pl
platform_frameworks_base/blob/master/core/iêu

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

BIÊN TẬP :

như được đề xuất trong các bình luận, thêm một dòng trước startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
nhưng nó đòi hỏi phải biết tên của hoạt động
njzk2

Tôi đã thử điều này và gặp lỗi khi khuyến nghị sử dụng cờ FLAG_ACTIVITY_NEW_TASK. Tôi đã thêm dòng này trước startActivity và nó đã hoạt động: aim.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze

1
@ njzk2 việc tìm tên gói cho một cái gì đó trên Google Play rất dễ dàng; Nó ở ngay trong URL. Ví dụ: play.google.com/store/apps/ Kẻ
Da-Jin

@iceybobby vâng, tên gói rất dễ tìm, nhưng làm thế nào để bạn tìm thấy tên lớp của hoạt động để khởi chạy?
phreakhead

@phreakhead Bạn nói đúng. Tôi nghĩ rằng tôi đã sử dụng giải pháp trong câu trả lời này: stackoverflow.com/a/8944286/1224186 vì vậy tên hoạt động là không cần thiết, và vì vậy tôi nghĩ rằng điều đó làm cho câu trả lời của tôi cho njzk2 không hữu ích ở đây.
Da-Jin

39

Nếu bạn đã có tên gói bạn muốn kích hoạt, bạn có thể sử dụng mã sau đây chung chung hơn một chút:

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

Tôi thấy rằng nó hoạt động tốt hơn trong các trường hợp không tìm thấy hoạt động chính bằng phương pháp thường xuyên bắt đầu hoạt động MAIN.


Câu trả lời tốt nhất cho tôi :-) hữu ích cho tôi. Cảm ơn
Jalpesh Khakhi

Nó là hoàn hảo cho tôi. Cảm ơn bạn rất nhiều Muzikant :)
Alex

13

Đây là mã của giải pháp của tôi dựa trên giải pháp 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

Sử dụng giải pháp từ nghịch đảo, tôi đã mở rộng đoạn mã với một chức năng, sẽ được gọi khi ứng dụng mong muốn chưa được cài đặt vào lúc này. Vì vậy, nó hoạt động như: Chạy ứng dụng theo tên gói. Nếu không tìm thấy, hãy mở thị trường Android - Google chơi cho gói này .

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

Và nó được sử dụng như thế này:

startApplication("org.teepee.bazant");

6

Dùng cái này :

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

Có ý kiến ​​gì không? mở một test.apk thay vì được cài đặt trong cửa hàng thiết bị bên trong ứng dụng hiện có. gợi ý khi nhấp vào nút ăn trưa ứng dụng test.apk đã được lưu trữ trong dự án hiện có. cảm ơn trong nâng cao.
Selim Raza

6

Mở ứng dụng nếu nó tồn tại hoặc mở ứng dụng Play Store để cài đặt 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)));
        }
    }
}

nên là nếu (i! = null)
vallllll

4

Để bắt đầu một hoạt động ứng dụng khác từ Hoạt động ứng dụng của tôi. Nó đang làm việc tốt cho tôi.

Mã bên dưới sẽ hoạt động nếu ứng dụng khác đã được cài đặt trong điện thoại của bạn nếu không thì không thể chuyển hướng một ứng dụng này sang ứng dụng khác. Vì vậy, hãy đảm bảo ứng dụng của bạn đã khởi chạy hay không

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

Xin vui lòng không viết nhiều câu trả lời gần giống với cùng một câu hỏi. Sử dụng liên kết "chỉnh sửa" bên dưới câu trả lời và thay đổi bản gốc.
AdrianHHH

3

// Điều này hoạt động trên 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

Vì các ứng dụng không được phép thay đổi nhiều cài đặt điện thoại, bạn có thể mở một hoạt động cài đặt giống như một ứng dụng khác.

Nhìn vào đầu ra LogCat của bạn sau khi bạn thực sự sửa đổi cài đặt theo cách thủ công:

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

Sau đó sử dụng điều này để hiển thị trang cài đặt từ ứng dụng của bạ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

Đối với API cấp 3+, không có gì hơn một dòng mã:

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

Trả về mục đích khởi chạy CATEGORY_INFO (ví dụ: các ứng dụng không có hoạt động của trình khởi chạy, hình nền, thường sử dụng thông tin này để cung cấp một số thông tin về ứng dụng) và, nếu không tìm thấy, hãy trả về gói CATEGORY_LAUNCH, nếu có.


2

Nếu bạn đang cố gắng bắt đầu một DỊCH VỤ thay vì hoạt động, thì điều này có hiệu quả với tôi:

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

Nếu bạn sử dụng phương thức aim.setComponent (...) như được đề cập trong các câu trả lời khác, bạn có thể nhận được cảnh báo "Ý định ngầm với startService không an toàn".


2

Ngoài ra, bạn cũng có thể mở ý định từ ứng dụng của mình trong ứng dụng khác với:

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

nơi urilà liên kết sâu đến các ứng dụng khác


2

Sử dụng như sau:

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

2

Khởi chạy một ứng dụng từ một ứng dụng khác trên Android

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

2

Nếu bạn muốn mở một ứng dụng khác và nó chưa được cài đặt, bạn có thể gửi nó đến Google App Store để tải xuống

  1. Đầu tiên tạo phương thức openOtherApp chẳng hạn

    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.- Cách sử dụng

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

0

Hãy thử mã này, Hy vọng điều này sẽ giúp bạn. Nếu gói này có sẵn thì nó sẽ mở ứng dụng hoặc nếu không thì mở cửa hàng play để tải xuống

    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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.