자신의 의도에서 다른 응용 프로그램 열기


136

내 프로그램을 업데이트하는 방법과 미리 정의 된 Uri (예 : SMS 또는 전자 메일)를 사용하여 프로그램을 여는 방법을 알고 있습니다.

MyTracks를 열 의도를 만들 수있는 방법이나 그들이 어떤 의도를 듣지 못하는 다른 응용 프로그램을 만들 수 있는지 알아야합니다.

DDMS 에서이 정보를 얻었지만이를 사용할 수있는 의도로 바꾸는 데 성공하지 못했습니다. 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

첫째, 안드로이드에서 "애플리케이션"의 개념은 약간 확장 된 것입니다.

응용 프로그램 (기술적으로 프로세스)에는 여러 가지 활동, 서비스, 콘텐츠 공급자 및 / 또는 브로드 캐스트 리스너가있을 수 있습니다. 둘 중 하나 이상이 실행중인 경우 응용 프로그램이 시작되어 실행 중입니다 (프로세스).

따라서 식별해야 할 것은 "응용 프로그램을 시작하는 방법"입니다.

좋아 ... 여기 당신이 시도 할 수있는 것이 있습니다 :

  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, 얻을 packageNamename
  6. 마지막으로,와 함께 또 다른 의도를 만들고 category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. 드디어, context.startActivity(newIntent)

세 개의 개별 앱을 열려면 어떻게해야합니까?
Si8


발신 앱과 실행 된 앱간에 데이터를 어떻게 전달할 수 있습니까? 'Intent.putExtra ()'를 찾았지만 시작된 앱에서 추가 데이터를 검색하는 방법을 모르겠습니다.
Bram

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

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 ( "app package name")에서 예외가 발생할 수 있기 때문입니다.
xtr

이것은 훌륭한 답변입니다. 간단한 예외를 잡아서 필요한 것을하고, 사용자에게 알리십시오
IT-Dan

5
stickler가 될 필요는 없지만 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);
}

MAIN 활동을 정기적으로 시작하는 방법으로 주요 활동을 찾지 못한 경우 더 효과적이라는 것을 알았습니다.


나에게 가장 좋은 답변 :-) 도움이되었습니다. 감사합니다
Jalpesh Khakhi

나에게 완벽합니다. 대단히 감사합니다 Muzikant :)
Alex

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를 엽니 다. 기존 프로젝트에 저장된 점심 점심 test.apk 앱을 클릭하면 힌트. 고급 감사합니다.
셀림 라자

6

존재하는 경우 응용 프로그램을 열거 나 설치를 위해 Play 스토어 응용 프로그램을 엽니 다.

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

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

다른 답변에서 언급 한대로 intent.setComponent (...) 메서드를 사용하면 "startService의 암시 적 의도는 안전하지 않습니다"경고가 표시 될 수 있습니다.


2

또는 다음을 사용하여 다른 앱에서 앱의 의도를 열 수도 있습니다.

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

uri다른 앱에 대한 딥 링크는 어디에 있습니까


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

사용법

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

0

이 코드를 사용해보십시오. 이것이 도움이되기를 바랍니다. 이 패키지를 사용할 수있는 경우 앱을 열거 나 다운로드를 위해 플레이 스토어를 엽니 다

    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.