Service启动Toast和Dialog的问题

Activity

  1. 两个button进行toast和activity的测试
  2. 记得配置service
public class DialogActivity extends AppCompatActivity {

    public static Context context;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        context = this;
    }

    public void toast(View view) {
        Intent intent = new Intent(context, DialogService.class);
        intent.putExtra("flag", false);
        startService(intent);
    }

    public void dialog(View view) {
        Intent intent = new Intent(context, DialogService.class);
        intent.putExtra("flag", true);
        startService(intent);
    }
}

Service

public class DialogService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, 
    int flags, int startId) {
        if(intent.getBooleanExtra("flag", false)) {
            new AlertDialog.Builder(this)
                    .setTitle("flag")
                    .setIcon(R.mipmap.ic_launcher)
                    .setMessage("dialog is available")
                    .create()
                    .show();
        } else {
            Toast.makeText(this, "toast is available", Toast.LENGTH_SHORT).show();
        }
        return super.onStartCommand(intent, flags, startId);
    }
}

测试结果一: 点击dialog报错,点击toast可以正常弹出吐司
原因: dialog必须依赖于window存在,一般只能在Activity中显示
由于Service也是继承Context的,所以toast可以正常弹出


测试二: 将Activity的context设置成全区变量,使用Activity的context创建dialog
结果: 可以正常弹出dialog
原因: 必须使用Activity的context才能正常显示,依存于Activity创建的窗口存在


测试二: 将Activity的context设置成全区变量,使用Activity的context创建dialog
结果: 可以正常弹出dialog
原因: 必须使用Activity的context才能正常显示,依存于Activity创建的窗口存在


测试三: 将Activity的theme设置成Theme.Dialog,将Activity以dialog的形式显示出来
结果: 后台service可以正常弹出dialog
原因: 有activity当然就可以创建dialog了


测试四:

 1.在dialog show之前调用dialog.getWindow()
.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
 2.在manifest中添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
3. 修改弹出dialog的方法
    public void dialog(View view) {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(context, DialogService.class);
                intent.putExtra("flag", true);
                startService(intent);
            }
        }, 5000L);
        finish();
    }

结果: 虽然网上都说可以正常弹出,但是

哈哈

原因: 未知错误 - - ,待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值