Android 通知后未返回,广播接收器未工作

Android 通知后未返回,广播接收器未工作,android,Android,我的目标是 按下按钮btnAktivieren, 然后,在随机定义的一段时间后,将显示一个通知。 我点击此通知,它将引导我进入alertdialog。 选择此AlertDialog后,返回到2。 到目前为止,我只得到了3,尽管代码应该可以一直工作 我试过的 MainActivity.java import android.app.Notification; import android.app.NotificationManager; import android.app.PendingInte

我的目标是

按下按钮btnAktivieren, 然后,在随机定义的一段时间后,将显示一个通知。 我点击此通知,它将引导我进入alertdialog。 选择此AlertDialog后,返回到2。 到目前为止,我只得到了3,尽管代码应该可以一直工作

我试过的

MainActivity.java

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    boolean aktiviert = false;
    public EditText minutenVon = null;
    public EditText minutenBis = null;
    public Context con = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        con = this;

        final Button btnAktivieren = (Button)findViewById(R.id.btnAktivieren);

        btnAktivieren.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                minutenBis = (EditText)findViewById(R.id.etBis);
                minutenVon = (EditText)findViewById(R.id.etVon);
                EditText etAktuelleAufgabe = (EditText)findViewById(R.id.etAktuelleAufgabe);
                if (aktiviert) {
                    btnAktivieren.setText("Aktivieren");
                    aktiviert = false;
                }
                else
                {
                    btnAktivieren.setText("Deaktivieren");
                    Random random = new Random();
                    int w = (int) (random.nextDouble() * (Double.parseDouble(minutenBis.getText().toString()) - Double.parseDouble(minutenVon.getText().toString())) + Double.parseDouble(minutenVon.getText().toString()));
                    int interval = w * 60000;
                    int interval_in_sekunden = w * 60;
                    aktiviert = true;
                    String aufgabe = "";
                    if (etAktuelleAufgabe.getText().toString() == "")
                        aufgabe = "Diese Information";
                    else
                        aufgabe = etAktuelleAufgabe.getText().toString();

                    PendingIntent pendingIntent;
                    Intent intent;

                    intent = new Intent(con, Kommt.class);
                    intent.putExtra("aufgabe", aufgabe);
                    intent.putExtra("minutenVon", minutenVon.getText().toString());
                    intent.putExtra("minutenBis", minutenBis.getText().toString());
                    pendingIntent = PendingIntent.getBroadcast(con, 0, intent,
                            PendingIntent.FLAG_UPDATE_CURRENT);

                    Notification notificationBuilder = new Notification.Builder(con)
                            .setContentTitle(aufgabe)
                            .setContentText("Test")
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setWhen((System.currentTimeMillis()/1000)+interval_in_sekunden)
                            .setContentIntent(pendingIntent)
                            .setAutoCancel(true)
                            .build();
                    NotificationManager notificationManager = (NotificationManager) getSystemService (Context.NOTIFICATION_SERVICE);

                    notificationManager.notify(0, notificationBuilder);
                }
            }
        });
    }
}
显示

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.test.test">
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
    <application
        android:allowBackup="true"
        android:launchMode="singleTop"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".Kommt" />
    </application>

</manifest>

尝试更改不同通知的id:

notificationManager.notify(0, notificationBuilder);

此处将0更改为某个动态数字

通常,对话框需要活动上下文,或者将对话框类型设置为系统警报对话框

alert.getWindow.setTypeWindowManager.LayoutParams.TYPE\u系统\u警报


这需要在清单中声明android.permission.SYSTEM\u ALERT\u窗口。

我认为onReceive只能存活10秒。因此,如果您的随机时间超过10秒,通知对象将被销毁,并在onReceive中更新。因此,我的建议是在服务中的新线程中而不是在广播接收器中执行此操作。

您试图从广播接收器打开AlertDialog,但无法找到您的contextcontext。请执行一件事,将用户重定向到from BroadcastReceiver,然后在onCreate中显示AlertDialog

问题一:您必须在警报对话框中传递主题

AlertDialog.Builder=新建 AlertDialog.Buildercontext, R.style.AppTheme

其次,您不能从Broadcastreceiver显示对话框,因为它无法获取上下文,开发人员希望您知道如何将用户从Broadcastreceiver重定向到活动。 错误您必须为此而崩溃

java.lang.RuntimeException:无法启动接收器 com.stackoverflow.Kommit: android.view.WindowManager$BadTokenException:无法添加窗口- 令牌null不适用于应用程序

因此,将用户重定向到MainActivity,而不是显示alertDialog,并在创建MainActivity时显示alert对话框,在该对话框中,您将拥有MainActivity的上下文

更新的Kommit.javaonReceive

Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Bundle b = new Bundle();
b.putInt("notify", 1);
i.putExtras(b); //Put your id to your next Intent 
context.startActivity(i);
在main活动OnCreate中


按p.Dee编辑:更正您的通知。

builder没有getWindow功能。您需要的是显示一个对话框,您可以通过扩展它来自定义自己的对话框。因此,在BroadcastReceiver中,我使用MainActivity类创建了一个Intent。我如何在MainActivity onCreate方法中过滤应用程序未正常启动,但被带到前台/由BroadcastReceiver启动的信息?耐心:我会接受你的回答,只要我能确认它有效。慢慢来:-
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Bundle b = new Bundle();
b.putInt("notify", 1);
i.putExtras(b); //Put your id to your next Intent 
context.startActivity(i);
Bundle b = getIntent().getExtras();  int value = 0; // or other values
if(b != null) 
value = b.getInt("notify"); 
if(value !=0)
{
 //show alertdialog 
}