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();
我需要在 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();