0

기본적으로 음악 응용 프로그램을 시작하는 안드로이드 음악 응용 프로그램을 시작한다고 가정합니다. 내가 시도한 방식은 다음과 같습니다.try/catch 내부에서 활동을 시작할 수 있습니까?

public void onStart(Intent intent, int startId) 
{ 
    // TODO Auto-generated method stub 
    super.onStart(intent, startId); 
    System.out.println("LOGS STARTED"); 
    ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE); 
    List l = am.getRunningAppProcesses(); 
    Iterator i = l.iterator(); 
    PackageManager pm = this.getPackageManager(); 
    while(i.hasNext()) 
    { 
     ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next()); 
     try 
     { 
      CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA)); 
      Log.w("LABEL", c.toString()); 
      if(c.equals("Music")) 
      { 
       System.out.println("HELLO \n"); 
            Intent in = new Intent(); 
       in.setClassName("com.android.music", "com.android.music.MediaButtonIntentReceiver"); 
       startActivity(in); 
      } 
     } 
     catch(Exception e) 
     { 
      //Name Not FOund Exception 
     } 
    } 

} 

logcat은 Hello를 표시하지만 어떤 이유로 음악이 시작되지 않습니다. 그러나 다른 위치로 이동하면 시작됩니다. 이런 방식으로 할 수있는 방법이 있습니까? 아니면 다른 방식으로해야합니까? 사용자가 아이콘을 클릭하면 음악 응용 프로그램이 팝업되기를 원합니다. 이것이 내가 c.equals ("음악") 부분을 만든 이유입니다. 는 시도의 내부에있는 이유는이 선 이유는

CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA)); 

오류가 발생하는 것입니다 그리고 그것은 시도/catch 문에 둘러싸여하는 빠른 수정했다.

+1

그냥 추측 ... "com.android.music.MediaButtonIntenrtReceiver"-> "com.android.music.MediaButtonIntentReceiver" – dougcunha

+0

확실히 가능합니다. 음악이 시작되지 않으면 몇 가지 다른 문제가있을 것입니다 ... – user219882

+0

@ 토마스 나는 음악을 시작하고 싶지 않아, 나는 단지 팝업 응용 프로그램을 원하지만 팝업되지 않습니다. –

답변

7

인 텐트에 대한 오해, 액티비티와 BroadcastReceivers의 차이점, 그리고 안드로이드가 이런 식으로 설정되는 일반적인 방식에 대한 오해가 많습니다. 우리가 그 중 일부를 정리할 수 있는지 봅시다. :)

인 텐트를 만들었으므로 특정 패키지에서이 인 텐트를 목표로 삼 으려는 경우 startActivity으로 전화하십시오. 그러나 액티비티가 아닌 com.android.music.MediaButtonIntentReceiver 구성 요소를 타겟팅하려고합니다. 이 의도로 startActivity을 호출하면 실패 할 가능성이 큽니다.

하지만 그보다 더 나쁩니다. com.android.music 패키지의 의도를 알리기 위해 정확한 활동 이름을 사용 했더라도 다른 음악 앱을 설치 한 사용자는 어떻게해야합니까? 많은 OEM 업체들은 자신의 변형 된 뮤직 플레이어를 장치에 탑재하고 있습니다. 즉, 패키지 이름을 명시 적으로 지정하면 해당 장치에서 오류가 발생합니다. 예를 들어 Nexus 기기에 제공된 Google Play 뮤직은 위에서 지정한 패키지가 아닌 com.google.android.music이라는 패키지 이름을 사용합니다.

지역화 된 앱 라벨 문자열을 기준으로 필터링하면 문제가 발생할 수 있습니다. 단순히 "음악"이라는 제목의 앱을 찾고 있지만이 문자열은 특정 음악 앱과 지역에 따라 다를 것입니다. 예를 들어 Google Play 뮤직에서는 'Google Play 뮤직'이라는 문자열을 사용하고 다른 언어로 번역 된 '뮤직'은이 정확한 문자열과 일치하지 않습니다.

마지막으로, ActivityManager로만 앱 프로세스를 실행하고 있습니다. 이 문제는 앱이 현재 해당 시간에 실행되지 않으면 어떻게 될까요? Android는 백그라운드에서 앱 프로세스를 종료 할 수 있으며 사용자는이를 알 필요가 없습니다. 사용자가 예기치 않게 중단되는 코드를 작성하고 있습니다.

그럼 어떻게 할 수 있습니까?

의도가 일반적으로 만들어집니다. 특정 패키지에 대한 실행중인 프로세스 목록을 사람이 읽을 수있는 특정 레이블 문자열로 긁어내는 대신 의미 론적으로 수행하려는 작업을 Android에 알리십시오. 음악 앱을 시작하려고합니다.

  • 우리는 우리가 원하는
  • 보다 전문적인 일보다는 "기본"조치를 실행하려면 : 라인으로 라인가는

    Intent musicIntent = new Intent(Intent.ACTION_MAIN) 
         .addCategory(Intent.CATEGORY_LAUNCHER) 
         .addCategory(Intent.CATEGORY_APP_MUSIC) 
         .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(musicIntent); 
    

    , 우리가 여기서했던 것은 것을 안드로이드 말씀입니다 런처 (홈 화면)에서 정상적으로 시작하는 활동이 되십시오.

  • 음악을 재생할 수 있다고 스스로 홍보하는 앱이 되길 원합니다.
  • 우리는 새로운 작업 인 o r 해당 응용 프로그램에 대한 작업이 이미있는 경우 전면에 가져옵니다.

더 적은 코드 줄에서는 더 일반적인 경우에이를 처리 할 수 ​​있었으며 가장자리 케이스에 더 저항력이 있으며 음악 응용 프로그램의 사용자 환경 설정을 자동으로 따르게됩니다. (의도와 일치하는 앱이 두 개 이상있는 경우 사용자는 어떤 앱을 시작할지 묻고 다음 번에 기본값으로 설정할 수 있습니다.)

서비스에서 활동을 시작한다고 언급했습니다. 사용자가 취한 조치에 대한 응답이 아닌 우연히 발생하는 경우 일반적으로 사용자 경험이 좋지 않은 것으로 간주되므로이를 염두에 두시기 바랍니다.

+0

+1 (vote) @ adamp에 동의합니다.이 상세한 정보를 공유해 주셔서 감사합니다. –

관련 문제