2010-11-29 7 views
0

のAndroidを使用しているとき、私はすべての異なる用語で混乱しています:活動、サービス...アンドロイド: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クラスへの参照を保持する方法はありますか?私はこれが自明だと確信していますが、私は今すぐ立ち往生しています。

は、次の2つのオプション

サービスの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]の上書きマニフェスト

    <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は、1つの引数(インテント)しか取らないことを私に伝えます。 RingerServer.classも指定しないでください。 – James

+0

はい、インテントにコンポーネントを指定しないで、アクションを実行してください。サービスのマニフェストで、そのアクションでインテントフィルタを定義していることを確認してください。 –

+0

私もAndroidManifest.XMLを変更しましたが、まだ動作していません: \t \t \t James

0

ServiceConnectionを使用して、サービスクラスにアクセスできます。サービスのONSTARTハンドラを経由して、物事を管理する、と述べた

Android service running after pressing Home key

がはるかに簡単である:ここではサンプルコードを参照してください。

関連する問題