2012-02-04 82 views
1

好吧,我已閱讀了許多不同的意見,如何做到這一點沒有成功。也許我錯過了什麼或沒有做正確的事情,所以任何幫助我欣賞...從另一個班開始的方法

所以,我有2個類。比方說,類A是一個活動,並有一個名爲classAmethod()的公共方法;

現在,B類實際上擴展了BroadcastReceiver。所以在B類我需要啓動classAmethod();

-

到目前爲止,當我嘗試這一點,就想讓它是靜態的。但我不能那樣做。我已經嘗試了一些其他方法,不要使其成爲靜態的,但由於某種原因,它會自動希望它是靜態的,如果不是這樣,一旦方法被調用,它將會FC。

回答

0

有很多方法可以做到這一點,所以我只想概述兩種方法,我會做到這一點。

選項1.使用一個監聽

創建在廣播接收機的接口

public interface Listener { 

public abstract void onEvent(); 

} 

創建靜態參考和setter

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

選項2.使用意圖

在廣播接收機

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

標誌FLAG_ACTIVITY_SINGLE_TOP將啓動活動如果沒有啓動,或者如果它正在運行,則在onNewIntent()被抓住,所以你需要在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 2012-02-05 01:02:09

0

方法屬於對象。如果你想調用一個方法,它必須在一個對象上完成。因此,如果你想從B類調用classAMethod(),那麼B類必須具有對A類的引用。

你沒有描述得太好,你想做什麼,它可能有更好的(更多的android-y )做你想做的事。也許如果你描述你正在嘗試做什麼,我們可以給你一個更好的答案。

0

如果您有機會發送Activity A self作爲上下文,則可以將其轉換爲具有classAmethod()的類implements implements接口。並打電話。使Activity實現具有方法classAmethod()的接口。

0

Android Activity是一個特殊的類,不應該被視爲一個'標準'的Java類。換句話說(就你的問題而言),它應該被認爲是一個自包含的類,因此不應該將公共方法暴露給其他(外部)類。

如果你希望你的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 

    } 
}