Android 如何在没有打开应用程序活动的情况下从后台服务显示对话框窗口
嘿,我开发了提醒服务应用程序。我想在应用程序后台服务通知我时显示弹出窗口。在不干扰我的应用程序活动或打开活动显示弹出窗口的情况下,我可以取消/关闭弹出窗口 不幸的是,我尝试了许多方法,但无法执行此事件以显示带有非活动类的对话框。现在我的代码没有任何错误。这是我提出观点的地方。它显示等待前台的消息,但我不想打开活动并显示弹出窗口。我怎样才能做到这一点请帮助我。在这里我张贴我的服务代码Android 如何在没有打开应用程序活动的情况下从后台服务显示对话框窗口,android,android-service,android-alertdialog,Android,Android Service,Android Alertdialog,嘿,我开发了提醒服务应用程序。我想在应用程序后台服务通知我时显示弹出窗口。在不干扰我的应用程序活动或打开活动显示弹出窗口的情况下,我可以取消/关闭弹出窗口 不幸的是,我尝试了许多方法,但无法执行此事件以显示带有非活动类的对话框。现在我的代码没有任何错误。这是我提出观点的地方。它显示等待前台的消息,但我不想打开活动并显示弹出窗口。我怎样才能做到这一点请帮助我。在这里我张贴我的服务代码 public class StartAlaramService extends Service { privat
public class StartAlaramService extends Service {
private WindowManager mWindowManager;
private WindowManager.LayoutParams mParams;
private View mRootView;
private Context mContext = null;
private LayoutInflater mInflater = null;
private View alertView = null;
@Override
public void onCreate() {
super.onCreate();
mContext=this;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
try{
if (null != mWindowManager) {
if (null != alertView) {
mWindowManager.removeView(alertView);
}
mWindowManager = null;
mParams = null;
mInflater = null;
alertView = null;
}
} catch (Exception ex){
ex.printStackTrace();
Log.e("SERVICE ", " Code Error");
}
showView();
return StartAlaramService.START_NOT_STICKY;
}
private void initState() {
Log.e("SERVICE ", "Intiate View State");
int LAYOUT_FLAG;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
} else {
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
}
mParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
LAYOUT_FLAG,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
if (null == mWindowManager) {
mWindowManager = ((WindowManager) mContext.getSystemService(WINDOW_SERVICE));
}
}
private void showView() {
try{
initState();
// Create the view
mRootView = initView();
// Show the view
mWindowManager.addView(mRootView, mParams);
// Do some extra stuff when the view's ready
} catch (Exception ex){
ex.printStackTrace();
Log.e("SERVICE ", " EXCEPTION " + ex.getMessage());
}
}
private View initView() {
mInflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mWindowManager = (WindowManager) mContext.getSystemService(WINDOW_SERVICE);
LayoutInflater li = LayoutInflater.from(mContext);
setTheme(R.style.custom_dialog);
alertView = li.inflate(R.layout.custom_layout_notification, null);
return alertView;
}
}
系统警报权限
已在清单中定义。也许您可以更改类型
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
要解析系统警报权限您必须获得DrawOverlays的权限。您可以通过以下两个步骤获得此权限 第1步:在主活动中输入下面的代码,检查是否已授予权限,如果未授予权限,则将请求权限
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}
}
第2步:然后在活动结果中添加以下代码
if (Build.VERSION.SDK_INT >= 23) {
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
}
}
}
你最好的办法是使用ForegroundService并显示通知而不是弹出窗口。我该怎么做,你能提供一些参考吗。我不想打开活动并显示弹出窗口或对话框窗口。有可能吗?你可以尝试一种黑客方法,使活动看起来像一个有透明背景和内容的对话框,然后启动,我恐怕我认为这当然是不可能的。。。但我仍然有一些问题,对话框自动关闭后一段时间。。完成后,我将发布代码。我找到了另一个答案。你的回答部分有帮助。我忘了添加镶嵌物。烛台覆盖物(这个)。现在我打开了一个对话框。但15秒后关闭