前台计时器停止时发送通知

问题描述

在创建计时器到达00:00时发送通知前台方法时,我有些麻烦。

我的意思是,我希望计时器结束时,如果应用程序关闭,它会发送通知事件。

我已经找到了一种方法显示通知,并使计时器即使在应用程序关闭的情况下也能正常工作。

但是,当我在计时器末尾放置用于发送通知功能时,它仅在打开应用程序时有效。

有我的MainActivity.java

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


        notificationmanager = notificationmanagerCompat.from(this);


        mTextViewCountDown = findViewById(R.id.timerTv);
        mButtonStartPause = findViewById(R.id.btn_start_pause);
        mButtonReset =  findViewById(R.id.btn_reset);



        mButtonStartPause.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (mTimerRunning) {
                    pauseTimer();
                } else {
                    startTimer();
                }


            }
        });
        mButtonReset.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resetTimer();
            }
        });


    }







    private void startTimer() {
        mEndTime = System.currentTimeMillis() + mTimeLeftInMillis;
        mCountDownTimer = new CountDownTimer(mTimeLeftInMillis,1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
            }
            @Override
            public void onFinish() {
                mTimeLeftInMillis=0;
                updateCountDownText();
                mTimerRunning = false;
                updateButtons();


                Notification notification = new NotificationCompat.Builder(getApplicationContext(),CHANNEL_1_ID)
                        .setSmallIcon(R.drawable.ic_money)
                        .setContentTitle("Test 1")
                        .setContentText("Important Message")
                        .setPriority(NotificationCompat.PRIORITY_HIGH)
                        .setCategory(NotificationCompat.CATEGORY_MESSAGE)
                        .build();
                notificationmanager.notify(1,notification);

            }
        }.start();
        mTimerRunning = true;
        updateButtons();
    }
    private void pauseTimer() {
        mCountDownTimer.cancel();
        mTimerRunning = false;
        updateButtons();
    }
    private void resetTimer() {
        mTimeLeftInMillis = START_TIME_IN_MILLIS;
        updateCountDownText();
        updateButtons();
    }
    private void updateCountDownText() {
        int minutes = (int) (mTimeLeftInMillis / 1000) / 60;
        int seconds = (int) (mTimeLeftInMillis / 1000) % 60;
        String timeLeftFormatted = String.format(Locale.getDefault(),"%02d:%02d",minutes,seconds);
        mTextViewCountDown.setText(timeLeftFormatted);
    }
    private void updateButtons() {
        if (mTimerRunning) {
            mButtonReset.setVisibility(View.INVISIBLE);
            mButtonStartPause.setText("Pause");
        } else {
            mButtonStartPause.setText("Start");
            if (mTimeLeftInMillis < 1000) {
                mButtonStartPause.setVisibility(View.INVISIBLE);
            } else {
                mButtonStartPause.setVisibility(View.VISIBLE);
            }
            if (mTimeLeftInMillis < START_TIME_IN_MILLIS) {
                mButtonReset.setVisibility(View.VISIBLE);
            } else {
                mButtonReset.setVisibility(View.INVISIBLE);
            }
        }
    }
    @Override
    public void onStop() {
        super.onStop();
        SharedPreferences prefs = getSharedPreferences("pref",MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putLong("millisLeft",mTimeLeftInMillis);
        editor.putBoolean("timerRunning",mTimerRunning);
        editor.putLong("endTime",mEndTime);
        editor.apply();
        if (mCountDownTimer != null) {
            mCountDownTimer.cancel();
        }

    }
    @Override
    public void onStart() {
        super.onStart();
        SharedPreferences prefs = getSharedPreferences("pref",MODE_PRIVATE);
        mTimeLeftInMillis = prefs.getLong("millisLeft",START_TIME_IN_MILLIS);
        mTimerRunning = prefs.getBoolean("timerRunning",false);
        updateCountDownText();
        updateButtons();
        if (mTimerRunning) {
            mEndTime = prefs.getLong("endTime",0);
            mTimeLeftInMillis = mEndTime - System.currentTimeMillis();
            if (mTimeLeftInMillis < 0) {
                mTimeLeftInMillis = 0;
                mTimerRunning = false;
                updateCountDownText();
                updateButtons();
            } else {
                startTimer();
            }
        }
    }


}

App java类

public class App extends Application {
    public static final String CHANNEL_1_ID = "channel1";
    @Override
    public void onCreate() {
        super.onCreate();
        createNotificationChannels();
    }
    private void createNotificationChannels() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel1 = new NotificationChannel(
                    CHANNEL_1_ID,"Channel 1",notificationmanager.IMPORTANCE_HIGH
            );

            notificationmanager manager = getSystemService(notificationmanager.class);
            manager.createNotificationChannel(channel1);
        }
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.krisix.notificationtest">

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />


    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>
        
        <service android:name=".ExampleService"/>
    </application>

</manifest>

谢谢您的帮助!

祝你有美好的一天

Krisix

解决方法

谢谢您的帮助,对不起,我是一个初学者,所以不确定我是否了解您告诉我的所有内容。 那你是说这样的话吗?

channels:
  - defaults
  - pytorch
  - conda-forge

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...