【问题标题】:show a dialog after closing application关闭应用程序后显示对话框
【发布时间】:2014-03-25 20:44:43
【问题描述】:

我想在关闭应用程序后显示一个对话框。 (例如,10 秒后。) 我用过闹钟:

主要活动:

@Override
protected void onStop() {
    // TODO Auto-generated method stub
    setupAlarm(10);
    super.onStop();
}


private void setupAlarm(int seconds) {
      AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
      Intent intent = new Intent(getBaseContext(), OnAlarmReceive.class);
      PendingIntent pendingIntent = PendingIntent.getBroadcast(
         MainActivity.this, 0, intent,
         PendingIntent.FLAG_UPDATE_CURRENT);

      // Getting current time and add the seconds in it
      Calendar cal = Calendar.getInstance();
      cal.add(Calendar.SECOND, seconds);

      alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);

    }

我的广播接收器:

public class OnAlarmReceive extends BroadcastReceiver {
 Context con = null ;


  private final Handler handler = new Handler() {

      @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
            final Dialog dialog = new Dialog(con);
            dialog.setContentView(R.layout.custom_dialog_update);
            dialog.setTitle("Title...");

            // set the custom dialog components - text, image and button
            TextView text = (TextView) dialog.findViewById(R.id.text);
            text.setText("Android custom dialog example!");
            ImageView image = (ImageView) dialog.findViewById(R.id.image);
            image.setImageResource(R.drawable.ic_launcher);

            Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
            // if button is clicked, close the custom dialog
            dialogButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });

            dialog.show();            


        super.handleMessage(msg);
    }

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

     // Start the MainActivity
//       Intent i = new Intent(context, MainActivity.class);
//       i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//       context.startActivity(i);
    //  Toast.makeText(context, "Please Updete Your Clip2iNi", Toast.LENGTH_LONG).show();

      con = context ;
      handler.sendEmptyMessage(0);
  }



}

错误:

02-24 12:38:53.796:E/AndroidRuntime(14711):致命异常:主要 02-24 12:38:53.796: E/AndroidRuntime(14711): android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 null 不适用于应用程序 02-24 12:38:53.796: E/AndroidRuntime(14711):在 android.view.ViewRootImpl.setView(ViewRootImpl.java:757) 02-24 12:38:53.796:E/AndroidRuntime(14711):在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:265) 02-24 12:38:53.796: E/AndroidRuntime(14711): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 02-24 12:38:53.796: E/AndroidRuntime(14711): 在 android.app.Dialog.show(Dialog.java:282) 02-24 12:38:53.796: E/AndroidRuntime(14711):在 com.example.ex56.OnAlarmReceive$1.handleMessage(OnAlarmReceive.java:43) 02-24 12:38:53.796: E/AndroidRuntime(14711): 在 android.os.Handler.dispatchMessage(Handler.java:99) 02-24 12:38:53.796:E/AndroidRuntime(14711):在 android.os.Looper.loop(Looper.java:137) 02-24 12:38:53.796: E/AndroidRuntime(14711):在 android.app.ActivityThread.main(ActivityThread.java:5328) 02-24 12:38:53.796:E/AndroidRuntime(14711):在 java.lang.reflect.Method.invokeNative(Native Method) 02-24 12:38:53.796:E/AndroidRuntime(14711):在 java.lang.reflect.Method.invoke(Method.java:511) 02-24 12:38:53.796: E/AndroidRuntime(14711):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 02-24 12:38:53.796: E/AndroidRuntime(14711): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 02-24 12:38:53.796:E/AndroidRuntime(14711):在 dalvik.system.NativeStart.main(Native Method)

没有Dialog,一切都是正确的。

【问题讨论】:

  • 您需要Activity 参考才能显示Dialog。而不是在这里您可以以Theme.Dialog为主题开始Activity...

标签: android dialog handler alarmmanager


【解决方案1】:
final Dialog dialog = new Dialog(con)

在这一行中connull 尝试通过Activity 引用喜欢

final Dialog dialog = new Dialog(YourActivity.this)

【讨论】:

  • MainActivity.this 还是 OnAlarmReceive.this ?我已经将 OnAlarmReceive 类分开了。
  • 您无法从单独的接收器类中显示对话框。如果您想将其作为内部类或从接收器启动一个透明的活动并显示..
【解决方案2】:

首先:您正在向对话框构造函数发送一个空上下文。这就是您收到此错误的原因。 第二:您应该显示通知而不是来自后台服务的对话框。对话框会打断用户,这是一个糟糕的用户体验。

第三:您将其命名为警报服务并使用接收器扩展它有点令人困惑。

无论如何,不​​建议显示来自服务的对话框。如果有更新,则从后台向用户显示通知。

感谢任何反馈。

谢谢。

【讨论】:

  • 这是正确的,即使他确实想显示一个对话框,他也应该首先重新打开一个活动(即使内容为空),因为当前的活动可以在它完成的时候完成应该已经显示了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多