1

Android2.0以降のデバイス用の代替のCarHomeアプリを作成しています。アプリは、電話が車のドックに挿入されたときに起動し、ドックから取り外されたときに終了する必要があります。また、アプリドロワーから起動できる必要があります。

現在、電話をドックに挿入したりドックから取り外したりすると、アプリを起動するたびにBroadcastReceiverが何らかの理由でDOCK_EVENTアクションを取得するため、アプリドロワーからアプリを起動できなくなるという問題が発生しています。BroadcastReceiverのみを登録するテストプロジェクトを作成しましたが、同じことが起こります。

BroadcastReceiverのコードは次のとおりです。

public class CarDockBroadcastReceiver extends BroadcastReceiver {
/**
 * @see android.content.BroadcastReceiver#onReceive(Context,Intent)
 */
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Put your code here

    if(intent.getExtras().containsKey("android.intent.extra.DOCK_STATE")){
        int state = intent.getExtras().getInt("android.intent.extra.DOCK_STATE",1);
        if(state == 0){
            Log.i("Dock", "Removed from dock!");    
            ((Activity)context).finish();
        }
    }
}

}

私の主な活動は次のとおりです。

public class MainActivity extends Activity {
/** Called when the activity is first created. */
CarDockBroadcastReceiver receiver;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    IntentFilter filter = new IntentFilter("android.intent.action.DOCK_EVENT");
    receiver = new CarDockBroadcastReceiver();
    registerReceiver(receiver, filter);
}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    unregisterReceiver(receiver);
    super.onDestroy();
}

}

メインアクティビティには、action.MAIN、category.LAUNCHER、category.DEFAULT、およびcategory.CAR_DOCKのインテントフィルターがあります。なぜこれが起こっているのかについてのアイデアはありますか?

4

1 に答える 1

3

Intent.ACTION_DOCK_EVENTスティッキーブロードキャストです。つまり、レシーバーを登録すると、Intentそのアクションの最後のブロードキャストがすぐに取得され、登録が解除されるまで後続のすべてのブロードキャストが取得されます。状況に対処する方法を見つける以外に、それについてできることはあまりありません。

ところで、あなたのIntent.ACTION_DOCK_EVENTではなくを使用することをお勧め"android.intent.action.DOCK_EVENT"しますIntentFilter。このように、何らかの理由で実際の文字列が変更された場合でも、コードを変更する必要はありません。

于 2010-05-02T17:58:45.000 に答える