5

アプリケーションがVOIPあります。デバイスの起動時にバックグラウンドでアプリケーションにログインする必要があります。

現在、私のアプリケーションへの初期化はUIActive( onCreate()) で行われています。

私は次のことを頭に入れています。誰でも助けて疑問を解消できますか。

  1. このタスクを達成するためにサービス設計は必須ですか??
  2. どちらService Remote(AIDL)またはローカル サービスで、その理由は?
  3. UIとの相互作用はどのようにService発生しますか?
  4. アクティブになった後UI、誰がコールバックを受け取りますか? UIまたはService
  5. ieをデータ パスServiceとして作成する必要がありますか?ControllerServiceUI

サンプル アプリ: スカイプ。

4

5 に答える 5

5

したがって、あなたが望むものを達成する方法はたくさんあります. この情報がお役に立てば幸いです。

  1. アプリケーションが起動時にバックグラウンドでログインするには、いくつかのオプションがあります。最初に必要なのは、マニフェストでレシーバーとして定義されている BroadcastReceiver です。BroadcastReceiver にACTION_BOOT_COMPLETEDインテントをキャッチさせます。ここからサービスを起動できます。これは#2につながります。

  2. あなたがしているすべてが RESTful 呼び出しである場合、実際には IntentService が理想的です。IntentServiceServiceの違いは単純です。IntentService はメイン スレッドから実行され、その「コード」を実行して終了します。ただし、サービスはメインスレッドで実行され (これは重要な事実です)、長時間実行されるため、stopSelf()を指定する必要があります。さらに言えば、Service は Activity に比べて強制終了される可能性も低くなります (アプリケーション コンポーネントは、新しく起動されたアプリ用のメモリ領域を確保するために強制終了されます)。より優先されます。サービスは、通知を必要とするフォアグラウンドサービスとして宣言することもできますが、より高い優先度が与えられます。あなたの場合、サービスは完璧だと思います。

  3. UI (アクティビティ) が開いたら、サービスに接続する最良の方法はBinderです。これにより、必要に応じて、さまざまなアプリケーション/コンポーネントからサービスへの複数のインターフェイスが可能になります。AIDL は非常に優れた機能ですが、私の経験からすると、すべてのパラメーターがプリミティブまたは Parcables でなければならないため、管理がはるかに困難です。AIDL は実際には IPC の一種であるため、遅く効率的でもありません。Service がインテントで開始されると、 onStartCommand() メソッドが呼び出されます。バインドしようとしているアプリケーションによってサービスが開始された場合、 onBind() メソッドが呼び出されます。ただし、 Intent を使用して Service を開始し、それにバインドすることはできます。データをすばやく呼び出すだけの RESTful なアプローチを好む場合は、 ResultReceiver で IntentService を使用できますこれは、Google I/O の例について書かれた素晴らしい記事であり、IntentService と ResultReceiver に興味がある場合は、全体的に適切に実装されています。

  4. これはあなた次第です。Binder または AIDL を使用すると、Activity はオブジェクト メソッドと同じように Service メソッドを呼び出すことができます。この場合、'callback' は単にメソッドの戻り値になります。ResultReceiver を使用する場合、Receiver に接続するアクティビティはコールバックになります。インテントをやり取りすることもできますが、これは面倒になる可能性があります。繰り返しますが、あなたの場合、バインダーのアプローチはレシーバーと同様に優れています。

  5. Service を MVVM システムのモデルと考えてください。アプリケーションのロジックを制御するものとしてではなく、データを取得するためのヘルパーとして使用してください。

これが面倒に思われる場合は申し訳ありませんが、探しているものを達成する方法はたくさんあります。自分の状況に何が最も適しているかは、自分が「感じる」ものがより良いかどうかの問題です。言うまでもなく、Android SDK はかなり大きいです。私はあなたを助けることができるすべてのトピックにヒットしようとしました. 幸運を!

于 2012-05-07T04:49:57.770 に答える
1

ブートレシーバーでサービスを試してください。 これは、簡単なグーグル検索の後に見つけた例です。次に、アプリの起動時にログイン情報をどこかに保存してください。どのようなコールバックがあるかわからないので、その部分に答えるのは本当に難しいです。コールバックが UI に影響を与える必要がある場合は、起動時にアクティビティに引き継がせてください。サービスのみが実行されているときに UI が必要な場合は、おそらく通知をスローし、コールバック データを使用して適切なアクティビティを呼び出すのが最善です。

于 2012-04-30T13:04:38.503 に答える
0

バックグラウンド サービス パッケージ com.javaorigin.android.sample.service; によってユーザー ログインを認証できます。

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service {

   String tag="TestService";
   @Override
   public void onCreate() {
       super.onCreate();
       Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();      
       Log.i(tag, "Service created...");
   }

   @Override
   public void onStart(Intent intent, int startId) {      
       super.onStart(intent, startId);  
       Log.i(tag, "Service started...");
   }
   @Override
   public void onDestroy() {
       super.onDestroy();
       Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show();
   }

   @Override
   public IBinder onBind(Intent intent) {
       return null;
   }
}


public class SampleAction extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {      
       super.onCreate(savedInstanceState);
       TextView view = new TextView(this);      
       view.setText("Service Test");
       Intent i = new Intent();
       i.setClassName( "com.javaorigin.android.sample.service",
        "com.javaorigin.android.sample.service.MyService" );
       bindService( i, null, Context.BIND_AUTO_CREATE);
       this.startService(i);      
       setContentView(view);
   }
}
于 2012-04-26T10:32:48.123 に答える
0

Service基本的な使用法に関する最良の情報源はSDKです。簡単AIDLに言うと、IPC 通信に使用され、同じプロセスでサービスを実行する限り、必要ありません。次の 2 つのオプションがあるとします。

  1. ログインだけが必要な場合は、起動時にサービスを開始し、ログインしてから、アプリケーションで受信されるログイン データがバンドルされたスティッキー ブロードキャストを送信できます。起動時にサービスを開始する一連の適切な方法については、この質問を参照してください。

    @Override
    public void onCreate() {
        Data data = performLogin();
        Intent i = new Intent(ACTION_VOIP_LOGIN);
        i.putExtra(EXTRA_LOGIN_DATA, data);
        mContext.sendStickyBroadcast(i);
    }
    
    ...
    
    private final class LoginReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // You may use a Bundle instead
            Data data = intent.getParcelableExtra();
            processLoginData(data)
        }
    }
    
    protected void onCreate(Bundle savedInstanceState) {
         ...
         IntentFilter filter = new IntentFilter(ACTION_VOIP_LOGIN);
         mContext.registerReceiver(new LoginReceiver(), filter);
    }
    
  2. 2 番目のケースでは、すべてのロジックをサービスに移動したい場合があります。Binderここで、クラスを拡張します。詳細については、このSDK の記事を参照してください。

于 2012-05-05T06:38:21.313 に答える
0

ログインに時間がかかる場合は[AccountManager][1]、一度だけにしてください。AccountManagerトークンの背後にある考え方、またはService.

あなたの特定のケースでは、あなたとあなたActivityを通信する最良の方法はServiceそれに拘束することだと思います。

于 2012-05-03T23:06:22.790 に答える