Android 来自 BroadcastReceiver 的弹出对话框

Android PopUp Dialog from BroadcastReceiver

我需要在 BroadcastReceiver 的新 window 中弹出 Bitmap,位图从 url 下载后从另一个服务发送。我在 BroadcastReceiver 上收到了正确的位图,但弹出对话框产生了一些异常。

 public class MainActivity extends Activity {

    ImageView popupImage;
    LocalBroadcastManager mLocalBroadcastManager;
    BroadcastReceiver broadcastReceiver;
    Dialog settingsDialog;
    String action = "com.bitmap.receive";

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   popupImage = (ImageView)findViewById(R.layout.image_layout);

   settingsDialog = new Dialog(this,android.R.style.Theme_Black_NoTitleBar_Fullscreen);

   mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
   broadcastReceiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
           if(intent.getAction().equals(action)) {
               //do work here
               Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");
               popupImage.setImageBitmap(bitmap);

               settingsDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
               settingsDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
               settingsDialog.setContentView(R.layout.image_layout);
               settingsDialog.show();
           } 
       }
   };



 //starting service
   findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
   Intent intent = new Intent(MainActivity.this, BackGroundService.class);
   startService(intent);
   }
   });

 //service onDestroy callback method will be called
   findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
   Intent intent = new Intent(MainActivity.this, BackGroundService.class);
   stopService(intent);
   }
   });
}

@Override
public void onResume() {
      super.onResume();
      //some other code for alarm service
      IntentFilter filter = new IntentFilter();
      filter.addAction(action);
      mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter);
}

// Method to start the service
public void startService(View view) {
   startService(new Intent(getBaseContext(), BackGroundService.class));
}

// Method to stop the service
public void stopService(View view) {
   stopService(new Intent(getBaseContext(), BackGroundService.class));
}
}

错误日志:

12-11 10:57:56.089: D/gralloc_goldfish(1930): Emulator without GPU emulation detected.
12-11 10:57:58.879: I/HelloService(1930): Service onCreate
12-11 10:57:59.009: I/HelloService(1930): Service onStartCommand
12-11 10:58:00.059: I/HelloService(1930): Service running
12-11 10:58:00.099: I/HelloService(1930): Service onDestroy
12-11 10:58:02.089: D/dalvikvm(1930): GC_FOR_ALLOC freed 207K, 9% free 2911K/3188K, paused 47ms, total 47ms
12-11 10:58:02.089: I/dalvikvm-heap(1930): Grow heap (frag case) to 4.290MB for 1451356-byte allocation
12-11 10:58:02.139: D/dalvikvm(1930): GC_FOR_ALLOC freed 1K, 7% free 4327K/4608K, paused 34ms, total 35ms
12-11 10:58:05.559: I/HelloService(1930): downlad compleated
12-11 10:58:05.559: D/AndroidRuntime(1930): Shutting down VM
12-11 10:58:05.559: W/dalvikvm(1930): threadid=1: thread exiting with uncaught exception (group=0xb4a41ba8)
12-11 10:58:05.599: E/AndroidRuntime(1930): FATAL EXCEPTION: main
12-11 10:58:05.599: E/AndroidRuntime(1930): Process: com.ibeacon.vapplicaspecials, PID: 1930
12-11 10:58:05.599: E/AndroidRuntime(1930): java.lang.NullPointerException
12-11 10:58:05.599: E/AndroidRuntime(1930):     at com.ibeacon.vapplicaspecials.MainActivity.onReceive(MainActivity.java:45)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at android.support.v4.content.LocalBroadcastManager.access[=12=]0(LocalBroadcastManager.java:46)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at android.support.v4.content.LocalBroadcastManager.handleMessage(LocalBroadcastManager.java:116)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at android.os.Handler.dispatchMessage(Handler.java:102)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at android.os.Looper.loop(Looper.java:136)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at android.app.ActivityThread.main(ActivityThread.java:5001)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at java.lang.reflect.Method.invokeNative(Native Method)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at java.lang.reflect.Method.invoke(Method.java:515)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
12-11 10:58:05.599: E/AndroidRuntime(1930):     at dalvik.system.NativeStart.main(Native Method)
12-11 11:02:28.179: I/Process(1930): Sending signal. PID: 1930 SIG: 9

删除紧跟在 setContentView() 调用之后的 popupImage 初始化。然后如下更改 onReceive() 中的代码,将 R.id.image_view_id 换成您 ImageView 的实际 ID。

Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");

settingsDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
settingsDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
settingsDialog.setContentView(R.layout.image_layout);

popupImage = (ImageView) settingsDialog.findViewById(R.id.image_view_id);
popupImage.setImageBitmap(bitmap);

settingsDialog.show();