Android在Service中弹出对话框二

上一篇我也写了一篇弹窗的,但是经过测试,Android8.0之后用不了,所以改一下

GitHub传送门

Myservice.class

package com.nf.service;

import android.app.AlertDialog;
import android.app.AliasActivity;
import android.app.Dialog;
import android.app.Service;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;

import java.sql.Time;
import java.util.Objects;
import java.util.Timer;
import java.util.TimerTask;

public class MyService extends Service {
    //  全局声明Handler
    private Handler mHandler;

    public MyService() {
    }

    //  创建一个服务
    @Override
    public void onCreate() {
        super.onCreate();
        mHandler = new Handler(Looper.getMainLooper());
    }

    //    服务启动
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("MyServer", "服务启动了");
        Timer timer = new Timer();

        int n = 5 * 60 * 10;
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
//                new Thread(new Runnable() {
//                    @Override
//                    public void run() {
//                        Looper.prepare();
//                        // TODO: 2019/11/7
//                        AlertDialog.Builder builder = new AlertDialog.Builder(MyApp.getContext());
//                        builder.setTitle("提示");
//                        builder.setMessage("已经过去五分钟了\n且行且珍惜");
//                        builder.setNegativeButton("明白了", null);
//                        Dialog dialog = builder.create();
//                        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//                        dialog.show();
//                        Looper.loop();
//                    }
//                }).start();
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
//                        AlertDialog.Builder builder = new AlertDialog.Builder(MyApp.getContext());
//                        builder.setTitle("提示");
//                        builder.setMessage("已经过去五分钟了\n且行且珍惜");
//                        builder.setNegativeButton("明白了", null);
//                        Dialog dialog = builder.create();
//                        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//                        dialog.show();
                        Log.i("MyServer", "服务启动了");
                        showDialog();
                    }
                });
                Log.i("MyServer", "五分钟了");
            }
        }, 10000, n);

        return super.onStartCommand(intent, flags, startId);
    }

    private void showDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext())
                .setIcon(android.R.drawable.ic_dialog_info)
                .setTitle("提示")
                .setMessage("已经五分钟过去了\n 时间不等人")
                .setPositiveButton("确定",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                                int whichButton) {
                            }
                        });
        AlertDialog dialog = builder.create();
        //设置点击其他地方不可取消此 Dialog
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        //8.0系统加强后台管理,禁止在其他应用和窗口弹提醒弹窗,如果要弹,必须使用TYPE_APPLICATION_OVERLAY,否则弹不出
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Objects.requireNonNull(dialog.getWindow()).setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));
        }else {
            Objects.requireNonNull(dialog.getWindow()).setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
        }
        dialog.show();
    }

    //    服务销毁
    @Override
    public void onDestroy() {
        Log.i("MyServer", "服务死了");
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return new MyBinder();
    }

    class MyBinder extends Binder {
        /**
         * 获取Service的方法 * @return 返回PlayerService
         */
        public MyService getService() {
            return MyService.this;
        }
    }

}

MainActivty.class

package com.nf.service;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    public Intent intent;
    ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
//            建立连接
//            获取服务操作对象
            MyService.MyBinder binder = (MyService.MyBinder) service;
            binder.getService();//获取到Service
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(this, MyService.class);
        startService(intent);//启动服务
        checkMyPermission();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
//        stopService(intent);
//        程序销毁时,退出服务
    }
    private void checkMyPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.canDrawOverlays(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                        Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, 1);
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Settings.canDrawOverlays(this)) {
                    Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
                } else {
                    // SYSTEM_ALERT_WINDOW permission not granted...
                    Toast.makeText(this, "未被授予权限,相关功能不可用", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}

AndroidManifest.xml

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/><!--这行代码必须存在,否则点击不了系统设置中的按钮-->
    <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
       <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"></service>

急着去上班,不做解释了

原文地址:https://www.cnblogs.com/inthecloud/p/11809876.html

时间: 2024-09-30 10:56:01

Android在Service中弹出对话框二的相关文章

Android 在Service中弹出对话框

MyService.class public class MyService extends Service { public MyService() { } // 创建一个服务 @Override public void onCreate() { super.onCreate(); } // 服务启动 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("MyServer"

关于android在Service中弹出Dialog对话框

在创建好AlertDialog类型对象后,要 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 同时还要设置权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission> 这样后就可dialog.show()了,要不然容易报错

Android中弹出对话框,AlertDialog关键代码

写在这里便于以后查看. Android中弹出对话框的关键代码: 1 btn01.setOnClickListener(new OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 Toast.makeText(musicActivity.this, "tanchu", 100).show(); 6 //以下是弹出对话框的关键代码, 7 AlertDialog.Builder b = new AlertDi

在服务程序中弹出对话框

最近一个项目中,客户一定要在服务程序中弹出对话框.跟客户好说歹说,说我们已经记了Log,弹对话框没有意义,反而可能由于弹框后没有人管,造成程序停滞在那里的情况.但是,客户不管这些,就要弹对话框. 没辙,弹吧,弹个框还能多费事?没想到,还真挺费事.WinXP和Windows2003下问题不大,上网找找方法,框就弹出来了.但是,Vista和Windows2008下,这个框死活弹不出来. 先说说在WinXP和Windows2003下用的方法. 第一种方法是在服务进程中启动一个子进程.用该子进程弹出对话

Android Web Service学习总结(二)

上篇文章做好了准备工作,现在就实践(android平台调用web service实现号码归属地查询) 1.    Ksoap2-android简介 在Android平台调用web service需要依赖于第三方类库ksoap2,它是一个SOAP Web service客户端开发包,主要用于资源受限制的Java环境如Applets或J2ME应用程序(CLDC/ CDC/MIDP).在Android平台中我们并不会直接使用ksoap2,而是使用ksoap2 android.KSoap2 Androi

Swing中弹出对话框的几种方式_JOptionPane.showMessageDialog等详解

Swing中弹出对话框的几种方式_JOptionPane.showMessageDialog等详解 在swing中,基于业务的考量,会有对话框来限制用户的行为及对用户的动作进行提示. Swing中提供了JOptionPane类来实现类似Windows平台下的MessageBox的功能,同样在Java中也有,利用JOptionPane类中的各个static方法 来生成各种标准的对话框,实现显示出信息.提出问题.警告.用户输入参数等功能.这些对话框都是模式对话框. ConfirmDialog ---

Android 手机卫士--弹出对话框

在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private Handler mHandler = new Handler() { // public void handleMessage(android.os.Message msg) { switch (msg.what) { case UPDATE_VERSION: //弹出对话框,提示用户更新 //showUp

怎么在InfoPath Web浏览器表单中弹出对话框?

在启用浏览器兼容模式的InfoPath表单是不能直接使用类似ASP.NET那种方式弹出对话框的, 那么我们是不是就不能弹出对话框了呢? 答案当然不是. 我们都知道XmlFormView控件是SharePoint中承载InfoPath表单页面显示的, 在查阅MSDN后, 我们发现可以为它增加一个"onnotifyhost"方法, 然后在事件中我们可以用代码注册JS弹出对话框. 这时候在表单可以调用就很简单了, this.NotifyHost("Msg") 即可. en

Android 在广播接收器中弹出对话框

特别需要注意的几点如下: 需要设置AlertDialog的类型 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 2. 需要声明Window弹框的权限 <user-permission android:name="android.premission.SYSTEM_ALERT_WINDOW" /> 3. 在点击AlertDialog的按钮时,如果利用Intent进行页面跳转,需要给Intent加入FLAG_ACTIVITY_NEW_T