0

サービスをテストし、受信機をブロードキャストするための簡単なアクティビティと、それに付随するサービスを作成しました。動作しているかどうかを確認するために、OnReceive() メソッドが呼び出されたときに表示されるメイン アクティビティ内に Toast を設定しました。しかし、私の人生では、これを機能させることはできません。

これらはコードです:

public class ServicesAndBroadcastIntentActivity extends Activity {

private Toast test;
private Intent intent;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    intent = new Intent(this,serviceD.class);
    test = Toast.makeText(this,"Test",Toast.LENGTH_LONG);
    test.setGravity(Gravity.CENTER,0,0);
}

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
        test.setText((intent.getStringExtra("EXTRA_MSG")));
        test.show();
    }
};


@Override
public void onResume(){
    super.onResume();
    startService(intent);
    registerReceiver(broadcastReceiver, new IntentFilter(serviceD.BROADCAST_ACTION));
}

@Override
public void onPause() {
    super.onPause();
    unregisterReceiver(broadcastReceiver);
    stopService(intent);        
}

}

public class serviceD extends Service{

private Intent intent;
static final String BROADCAST_ACTION = "com.mejg.ServicesAndBroadcastIntent";

public void onCreate() {
    super.onCreate();
    intent = new Intent(BROADCAST_ACTION);  
}

public void onStart(){
    intent.putExtra("EXTRA_MSG","hola");
    sendBroadcast(intent);
    stopSelf();
}

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

}

4

1 に答える 1

1

startService()の前に電話してregisterReceiver()います。どちらも非同期操作ですが、順番に発生する可能性があります。したがって、onStart()サービスが機能する前に呼び出されます。registerReceiver()つまり、受信機が設定される前にブロードキャストが終了します。

この種の実験では、基本的な UI (たとえば、1 つの非常に大きなボタン) を設定しstartService()、ボタンが押されたときに呼び出しを行うことをお勧めします。

また、サービスがを呼び出すため、アクティビティstopSelf()から呼び出す必要はありません。stopService()

また、LocalBroadcastManagerこれに使用することを検討することもできます。すべてプロセス内にとどまるため、パフォーマンスとセキュリティが向上した同じ基本構文です。

アップデート

またonStart()、2年以上にわたって廃止されており、とにかくメソッドの署名が間違っています。onStartCommand()を正しいパラメータで使用してください。

@Overrideまた、メソッドをオーバーライドするときにも使用して、この種の問題をキャッチするのに役立ちます。

于 2012-04-28T22:22:06.707 に答える