3

私のアプリには、onCreate() の otto イベント バスでイベントを発生させるランチャー アクティビティがあります。アクティビティ自体は、サービスが開始されていることを確認します。バスは、バスの派生クラスの BusProvider を介してシングルトンとして実装されます。アクティビティからバスに投稿するたびに、アクティビティ自体がイベント (デバッグ目的でサブスクライブしました) を受け取りますが、サービスは受け取りませんが、どちらもメイン スレッドで送信する必要があります。

ottoは活動の中でイベントを受けているので、基本的には仕事に取り掛かります。サービス(background)とアクティビティ(ui)の違いが原因でサービスでイベントを受け取れないのではないかと推測しているのですが、なぜでしょうか?

My派生バスクラスのコードは次のとおりです。

public class MainBus extends Bus {
    private final Handler handler = new Handler(Looper.getMainLooper());

    public MainBus(ThreadEnforcer any) {
        super(any);
    }

    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            handler.post(new Runnable() {
                @Override
                    public void run() {
                        MainBus.super.post(event);
                }
            });
        }
    }
}   

これがBusProviderシングルトンです

public final class BusProvider {
    // Also tried with ThreadEnforcer.MAIN 
    private static final MainBus BUS = new MainBus(ThreadEnforcer.ANY);

    public static MainBus getInstance() {
        return BUS;
    }

    private BusProvider() {
        // No instances.
    }
}

これが私のアクティビティの関連コードです

public class Splashscreen extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        BusProvider.getInstance().register(this);

        // Start the Service if not yet started.
        if (!isMyServiceRunning()) {
            startMyService();
        }

        LogProvider.getInstance().d("Splashscreen", "Activity started.");
        BusProvider.getInstance().post(new SplashscreenStartupCompletedEvent());
        LogProvider.getInstance().d("Splashscreen",
                "After Startup Event posted");

        setContentView(R.layout.splashscreen);
    }

    /**
     * private function to check if the service is running
     * 
     * @return boolean True if the service is running, false otherwise
     */
    private boolean isMyServiceRunning() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager
                .getRunningServices(Integer.MAX_VALUE)) {
            if (MyApplicationService.class.getName().equals(
                    service.service.getClassName())) {
                LogProvider.getInstance().i("Splashscreen",
                        "Service is already running.");
                return true;
            }
        }
        LogProvider.getInstance().n("Splashscreen", "Service is not running.");
        return false;
    }

    /**
     * private function to start the Backgroundservice
     */
    private void startMyService() {
        LogProvider.getInstance().i("Splashscreen", "Service will be started.");
        Context context = getApplicationContext();
        Intent service = new Intent(
                context,
                com.classpath.MyApplicationService.class);
        context.startService(service);
    }

    @Subscribe
    public void afterStartEvent(SplashscreenStartupCompletedEvent event) {
        LogProvider.getInstance().d("afterStartEvent", "Event received");
    }
}

および本サービスの関連部分

public class MyApplicationService extends Service {
    @Override
    public void onCreate() {
        BusProvider.getInstance().register(this);       
        super.onCreate();
    }

    @Subscribe
    public void afterStartupCompleted(SplashscreenStartupCompletedEvent event) {
        LogProvider.getInstance().d("MyApplicationService",
                "StartupCompletedEvent empfangen");
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}
4

0 に答える 0