0

私は2つの活動をしていBroadcastReceiverます。ICSエミュレーターの両方completeReceiverで動作しますclickReceiverが、私の電話でJBは最初の1つだけが動作します。

なぜか想像もつきません。助けてくれてありがとう。

(私が試したのは、 :で変更ShareActivity.thisすることでしたが、同じ結果です)。contextAlertDialog.Buider

public class ShareActivity extends Activity {
    // stuff
    @Override
    protected void onStart() {
        super.onStart();
        registerReceiver(completeReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        registerReceiver(clickReceiver, new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED));
        Log.v(DEBUG_TAG, "_onStart");
    }

    // other stuff

    BroadcastReceiver completeReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
                long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -2);
                if (enqueue != -1 && id != -2 && id == enqueue) {
                    Query query = new Query();
                    query.setFilterById(id);
                    dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                    Cursor c = dm.query(query);
                    if (c.moveToFirst()) {
                        int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                        int status = c.getInt(columnIndex);
                        if (status == DownloadManager.STATUS_SUCCESSFUL) {
                        AlertDialog.Builder helpBuilder = new AlertDialog.Builder(ShareActivity.this);
                        helpBuilder.setIcon(android.R.drawable.ic_dialog_info);
                        helpBuilder.setTitle(getString(R.string.information));
                        helpBuilder.setMessage(getString(R.string.download_complete_dialog_msg1) + titleRaw + getString(R.string.download_complete_dialog_msg2));
                        helpBuilder.setPositiveButton(getString(R.string.download_complete_dialog_positive), new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog, int which) {

                                Intent v_intent = new Intent();
                                v_intent.setAction(android.content.Intent.ACTION_VIEW);
                                v_intent.setDataAndType(videoUri, "video/*");
                                startActivity(v_intent);
                            }
                        });

                        helpBuilder.setNegativeButton(getString(R.string.dialogs_negative), new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog, int which) {
                                    // cancel
                            }
                        });

                        AlertDialog helpDialog = helpBuilder.create();
                        if (! ((Activity) context).isFinishing()) {
                                helpDialog.show();
                        }
                    }
                }
            }
        }
    };

    BroadcastReceiver clickReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                    long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -2);
                    if (enqueue != -1 && id != -2 && id == enqueue) {
                            Query query = new Query();
                            query.setFilterById(id);
                            dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                            Cursor c = dm.query(query);
                            if (c.moveToFirst()) {
                                    int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                                    int status = c.getInt(columnIndex);
                                    if (status == DownloadManager.STATUS_RUNNING ||
                                            status == DownloadManager.STATUS_PAUSED ||
                                            status == DownloadManager.STATUS_PENDING) {
                                AlertDialog.Builder helpBuilder = new AlertDialog.Builder(ShareActivity.this);
                                helpBuilder.setIcon(android.R.drawable.ic_dialog_info);
                                helpBuilder.setTitle(getString(R.string.cancel_download_dialog_title));
                                helpBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog, int which) {
                                    dm.remove(enqueue);
                                    Log.d(DEBUG_TAG, "download cancelled");
                            }
                        });

                        helpBuilder.setNegativeButton(getString(R.string.dialogs_negative), new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog, int which) {
                                    // cancel
                            }
                        });

                        AlertDialog helpDialog = helpBuilder.create();
                        if (! ((Activity) context).isFinishing()) {
                                helpDialog.show();
                        }
                    }
                }
            }
        }
    };
}
4

1 に答える 1

0

私が使用しているCyanogenModに関連する問題。具体的には、パッケージ CM アップデーターが関与する必要があります。電話の起動時とアップデーターアプリが実行されるまで、レシーバーは動作します。アップデーターに初めてアクセスした後、上記のアプリのレシーバーが機能しなくなります。

これはcmupdaterレシーバーからのものです:

レシーバー:

package com.cyanogenmod.updater.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import com.cyanogenmod.updater.UpdatesSettings;

public class NotificationClickReceiver extends BroadcastReceiver{
     private static String TAG = "NotificationClickReceiver";

     @Override
     public void onReceive(Context context, Intent intent) {

         // Bring the main app to the foreground
         Intent i = new Intent(context, UpdatesSettings.class);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP |
                 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         context.startActivity(i);
     }
 }

マニフェスト:

    <receiver android:name="com.cyanogenmod.updater.receiver.NotificationClickReceiver">
        <intent-filter>
            <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
            <category android:name="android.intent.category.HOME"/>
        </intent-filter>
    </receiver>

通知バーからダウンロードをクリックすると、システム ダウンロード マネージャーが前面に表示されるようにコードを変更しました。cmupdater が実行されている場合は、代わりに呼び出されます。その後、何も呼び出されません。これにより、それらの間の可能性のあるリンクについて考えるようになりました。

解決策がないので、これは適切な答えではないかもしれません。しかしそれだけです。すべては、同じ ROM を持つ別のデバイスでもテストされています。エミュレータ上ではすべて正常に動作します。

于 2013-02-24T21:56:53.700 に答える