2012-02-04 7 views
1

申し訳ありませんが、私は成功しないでこれを行う方法について多くの異なる見解を読んできました。たぶん私は何かが欠けているか、何か正しいことをやっていないので、私は感謝する任意のヘルプ...別のクラスからスタートメソッド

私は2つのクラスがあります。 Class Aがアクティビティであり、classAmethod()というパブリックメソッドがあるとします。

ここで、クラスBは実際にはBroadcastReceiverを拡張します。クラスBではclassAmethod()を起動する必要があります。

-

これまでのところ、これを静的にしたいと思うでしょう。しかし、私はそれを行うことはできません。私はそれを静的にしてはいけないいくつかの他のメソッドを試しましたが、何らかの理由でそれが自動的に静的であることを望み、何かがなければメソッドが呼び出されるとFCになります。

答えて

0

これを行う方法はいくつかありますので、私がこれを行う方法を2つ説明します。

オプション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

オプションの内部クラスとしてBroadcastReceiverを定義します。放送受信機は、通知が受信されると実行される。 SMSなど。しかし、私はそれを行って、うまくいく – user1190019

0

メソッドはオブジェクトに属します。メソッドを呼び出す場合は、オブジェクトに対して行う必要があります。そのため、クラスBからのclassAMethod()への呼び出しを希望する場合、クラスBはクラスAへの参照を持っていなければなりません。

あなたは何をしたいのかよく分かりません。 )あなたがしたいことをする方法。おそらく、あなたがしようとしていることを記述すると、私たちはより良い答えを与えることができます。

0

アクティビティA自己をコンテキストとして送信する機会があれば、それをclassAmethod()を持つインタフェースを実装する型にキャストできます。と呼ぶ。 makeアクティビティは、メソッドclassAmethod()を持つインタフェースを実装します。

0

Android Activityは特別なクラスであり、「標準」Javaクラスとして扱うべきではありません。言い換えれば(あなたの質問の目的のために)、自己完結型のクラスとみなされるべきであり、パブリックメソッドを他の(外部の)クラスに公開すべきではありません。

あなたのBroadcastReceiverがあなたのActivityのメソッドへのアクセスを持っているしたい場合は、1が完全に働いたあなたのActivity ...

public class MyActivity extends Activity { 

    ... 

    private class MyBroadcastReceiver extends BroadcastReceiver { 

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

    } 
} 
関連する問題