Android5.0 이후에 은밀하게 ServiceBug 시작

이전에 프로세스 간 통신에 관한 블로그를 쓴 적이 있다
통신 프로세스 간 통신 - AIDL
당시에는 4.2의 시스템을 사용했고 크로스 프로세스의 서비스는 액션에 따라 시작할 수 있다
                Intent intent = new Intent();

                intent.setAction("android.intent.action.aidl.server");

그런데 지금 6.0을 썼는데 오타가 났어요.
01-06 01:54:14.140: : Process: com.fang.zrf.clientdemo, PID: 18507
01-06 01:54:14.140: : java.lang.IllegalArgumentException: Service Intent must be explicit: 
                                            Intent { act=android.intent.action.aidl.server }
01-06 01:54:14.140: : 	at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1209)
01-06 01:54:14.140: : 	at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1308)
01-06 01:54:14.140: : 	at android.app.ContextImpl.bindService(ContextImpl.java:1286)
01-06 01:54:14.140: : 	at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
01-06 01:54:14.140: : 	at com.fang.zrf.clientdemo.MainActivity.onClick(MainActivity.java:70)
01-06 01:54:14.140: : 	at android.view.View.performClick(View.java:5205) 

잘못된 곳을 보고하는 서비스의 intent는 명확하고 표시된 지적이어야 합니다.이 때 같은 응용 프로그램에서 클래스 이름으로 시작할 수 있다면, 같은 응용 프로그램에서 서비스의 흐름을 통해 실행할 수 없다면.
setComponent에서 호출 가능
intent.setComponent(new ComponentName("com.fang.zrf.serverdemo",  "com.fang.zrf.serverdemo.CustomService"));

통과할 수 있어요.
intent.setClassName("com.fang.zrf.serverdemo",  "com.fang.zrf.serverdemo.CustomService");

본질적으로 같은 setClassName 원본이ComponentName 대상을 만들었기 때문에 호출합니다.
public Intent setClassName(String packageName, String className) {
        mComponent = new ComponentName(packageName, className);
        return this;
    }

사실 사고방식은packagename과classname을 통해 호출하는 것이고 방법이 매우 많다.

좋은 웹페이지 즐겨찾기