2012-02-04 2 views
1

좋아요, 제가 성공하지 못하게하는 방법에 대한 여러 가지 견해를 읽었습니다. 어쩌면 내가 뭔가를 놓치고 있거나 뭔가 제대로하지 않는 것, 그래서 어떤 도움을 주셔서 감사합니다 ...다른 클래스의 시작 메소드

그래서, 나는 2 개의 클래스가 있습니다. 클래스 A가 액티비티이며 classAmethod()라는 공용 메서드가 있다고 가정 해 보겠습니다.

이제 클래스 B는 BroadcastReceiver를 확장합니다. 따라서 Class B에서는 classAmethod()를 시작해야합니다.

-

지금까지 내가이 때, 그것은 정적 확인하는 것이 좋습니다. 그러나 나는 그것을 할 수 없다. 정적으로 만들지 않는 다른 방법을 시도했지만 어떤 이유로 자동으로 정적이되기를 원하며 뭔가가 없으면 메서드가 호출되면 FC가됩니다.

답변

0

이렇게 할 수있는 여러 가지 방법이 있으므로이 방법을 두 가지로 요약 해 보겠습니다.

옵션 1. 수신기

생성 방송 수신기 인터페이스

public interface Listener { 

public abstract void onEvent(); 

} 

private static MessageListener mListener = null; 

@Override 
public void onReceive(Context context, Intent intent) { 
    //stuff 
     if(mListener != null) 
      mListener.onEvent(); 
} 

public static void setListener(Listener l) { 
    mListener = l; 
} 

다음 활동에 수신기를 구현 정적 참조 및 세터를 생성

class MyActivity implements Listener{ 

    @Override 
    public void onResume(){ 
     //register the listener, should probably unregister in onDestroy 
     BroadCastReceiver.setListener(this); 
    } 

    @Override 
    public void onEvent(){ 
     //do something 
    } 
} 
그렇게 당신이 필요가 onNewIntent()에 잡힐 것입니다 실행중인 경우

옵션 방송 수신기

Intent intent = new Intent(); 
Bundle bundleToSend = new Bundle(); 
//BUNDLE_EXTRA,DO_SOME_ACTION and ACTION_KEY are just constants so just define them somewhere 
bundleToSend.putInt(ACTION_KEY, DO_SOME_ACTION);   
intent.putExtra(BUNDLE_EXTRA, bundleToSend); 
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(intent); 

플래그 2. 사용 의도

FLAG_ACTIVITY_SINGLE_TOP는 시작되지 않을 경우 활동을 시작하거나 것입니다 onCreate()onNewIntent()에 일부 코드를 입력하여 번들을 추출하고 조치를 확인하십시오.

final Bundle bundleReceived = intent.getBundleExtra(BUNDLE_EXTRA); 
if (bundleReceived.getInt(ACTION_KEY) == DO_SOME_ACTION) { 
    //do something 
} 

옵션 1은 실제로 활동이 최전방에있을 때 브로드 캐스트 수신기에서만 수신 할 때 유용합니다. 옵션 2는 더 다양한 기능을 제공하며, 앱이 실행 중이 아닌 경우에도 사용할 수 있습니다 (예 : 브로드 캐스트 리시버가 부팅시 시작된 서비스에서 실행 됨). 따라서 활동이 시작되고 활동이 활동 상태와 상관없이 수행됩니다.

+0

옵션 1은 완벽했다. 알림 수신시 브로드 캐스트 리시버가 실행됩니다. SMS와 같은. 하지만, 나는 그것을 잘하고 잘 작동합니다. – user1190019

0

메쏘드는 객체에 속합니다. 메소드를 호출하려면 객체에서 수행해야합니다. 따라서 B 클래스의 classAMethod()을 호출하려면 클래스 B는 클래스 A에 대한 참조가 있어야합니다.

당신이하고 싶은 일을 너무 잘 묘사하지 않았 으면 좋을 것 같습니다 (더 android-y) 당신이하고 싶은 일을하는 방법. 아마도 당신이하려는 것을 묘사한다면 우리는 당신에게 더 나은 대답을 줄 수 있습니다.

0

활동 A 자체를 컨텍스트로 보낼 기회가 있다면 classAmethod();가있는 인터페이스를 구현하는 유형으로이를 전달할 수 있습니다. 전화 해. make Activity는 classAmethod() 메소드가있는 인터페이스를 구현합니다.

0

Android Activity은 특수 클래스이며 '표준'Java 클래스로 취급하지 않아야합니다. 다른 말로하면 (질문의 목적을 위해), 자급 자족 클래스로 간주되어야하며, 따라서 public 메소드를 다른 (외부) 클래스에 노출해서는 안됩니다. 당신이 당신의 BroadcastReceiver은 다음 Activity의 내부 클래스로 BroadcastReceiver을 정의하여 Activity에 방법에 액세스 할 수 있도록하려면

...

public class MyActivity extends Activity { 

    ... 

    private class MyBroadcastReceiver extends BroadcastReceiver { 

     // Once instantiated and registered by MyActivity, can 
     // access methods and fields of MyActivity 

    } 
} 
관련 문제