2010-11-29 3 views
0

안드로이드 사용할 때 모든 다른 용어와 혼동하기 오전 :안드로이드 : startService()를 호출 한 후 클래스를 얻기

startService(new Intent(this, RingerServer.class)); 
: 활동, 서비스를 ... 지금

나는 서비스를 만들

그리고이 서비스를 스레드 시작 :이 서비스에서

public class RingerServer extends Service { 

    public void onCreate() { 
     super.onCreate(); 

     new Thread(new Ringer()).start(); 
    } 

    public class Ringer implements Runnable { ... } 

    public void refuseConnection() { ... } 

} 

을의 RingerServer, 나는 또한 내가 사용하고자하는 방법이있다. RingerServer에 대한 참조를 유지하고 싶습니다. 기본적으로 서비스를 작성한 활동이 refuseConnection()을 호출 할 수 있지만 해당 메소드를 정적으로 만들 수는 없으면 좋겠습니다.

startService는 ComponentName을 반환하므로 RingerServer로 다시 캐스팅하려고했지만 작동하지 않는 것 같습니다. 나는 그것이 getClass()를 가지고 있는지 확인했다. 그리고 getClassName()은 나에게 정확한 클래스를 준다. 그래도 getClass()를 제대로 사용할 수 없었습니다.

새로 만든 RingerServer 클래스에 대한 참조를 유지할 수있는 방법이 있습니까? 나는 이것이 사소한 것이라고 확신하지만, 나는 지금 막 붙어있다.

당신은 두 가지 옵션

서비스의

1.Override onStartCommand을 가지고 작업을 사용하여 의도로 서버를 시작, 당신에게

제임스

+0

활동 = 사용자가 상호 작용할 수있는 UI입니다. 서비스에는 UI가없고 백그라운드에서 실행됩니다. – Raunak

+0

그러나 여전히 클래스이므로 서비스에서 몇 가지 메소드를 호출 할 수 있습니까? – James

답변

0

를 대단히 감사합니다. 그 의도는 당신이 refuseConnection를 호출 할 수 있습니다 의도 행동()을 기반으로, 서비스 수신됩니다

//In Activity 
... 
//Start the service 
Intent intent=new Intent("com.xx.xx.REFUSE_CONNECTION"); 
startService(this,intent); 
... 
//In Service 

public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 
     if(intent.getAction().equals("com.xx.xx.REFUSE_CONNECTION")){ 
      //Refuse the connection 
      refuseConnection(); 
     }else { 
      //Do something else 
     } 
} 

//

  1. AIDL 인터페이스를 구현하고 onBind 오버라이드 (override) 매니페스트

    <service android:name="RingerService"> 
        <intent-filter> 
         <action android:name="com.xx.xx.REFUSE_CONNECTION"></action> 
        </intent-filter> 
    </service> 
    
    () 서비스에서

    , 이 인터페이스를 사용하여 refuseConnection()을 호출하십시오. AIDL에 관한이 링크 http://developer.android.com/guide/developing/tools/aidl.html을 참조하십시오.
+0

고맙습니다. 첫 번째 해결책이 정말 마음에 듭니다. 그러나 startService는 하나의 인수 인 인 텐트만을 취한다고 말하면서 불평합니다. 나는 RingerServer.class도 지정하도록되어 있지 않다. – James

+0

예, 의도에 대한 구성 요소를 지정하지 말고 조치 만하십시오. 서비스에 대한 매니페스트에서 해당 동작으로 인 텐트 필터를 정의해야합니다. –

+0

AndroidManifest.XML도 수정했지만 작동하지 않습니다. \t \t \t James

0

ServiceConnection을 사용하여 서비스 클래스에 액세스 할 수 있습니다. 서비스의 ONSTART 핸들러를 통해 일을 관리했다

Android service running after pressing Home key

훨씬 간단하다 : 여기 예제 코드를 참조하십시오.

관련 문제