android 应用程序关闭时发送通知

k75qkfdt  于 2023-01-07  发布在  Android
关注(0)|答案(4)|浏览(423)

当应用程序完全关闭时,如何通过编程方式发送通知?
示例:用户关闭应用程序(也在Android任务管理器中)并等待。应用程序应在X秒后或应用程序检查更新时发送通知。
我尝试使用这些代码示例,但是:

如果可以的话,试着用一个例子来解释它,因为初学者(像我一样)这样可以更容易地学习它。

t98cgbkg

t98cgbkg1#

您只需在Activity生命周期中的on Stop()启动此服务,即可使用此服务。startService(new Intent(this, NotificationService.class));,然后可以创建一个新的Java类,并将以下代码粘贴到其中:

public class NotificationService extends Service {

    Timer timer;
    TimerTask timerTask;
    String TAG = "Timers";
    int Your_X_SECS = 5;

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");
        super.onStartCommand(intent, flags, startId);

        startTimer();

        return START_STICKY;
    }

    @Override
    public void onCreate() {
        Log.e(TAG, "onCreate");

    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy");
        stoptimertask();
        super.onDestroy();

    }

    //we are going to use a handler to be able to run in our TimerTask
    final Handler handler = new Handler();

    public void startTimer() {
        //set a new Timer
        timer = new Timer();

        //initialize the TimerTask's job
        initializeTimerTask();

        //schedule the timer, after the first 5000ms the TimerTask will run every 10000ms
        timer.schedule(timerTask, 5000, Your_X_SECS * 1000); //
        //timer.schedule(timerTask, 5000,1000); //
    }

    public void stoptimertask() {
        //stop the timer, if it's not already null
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    public void initializeTimerTask() {

        timerTask = new TimerTask() {
            public void run() {

                //use a handler to run a toast that shows the current timestamp
                handler.post(new Runnable() {
                    public void run() {

                        //TODO CALL NOTIFICATION FUNC
                        YOURNOTIFICATIONFUNCTION();

                    }
                });
            }
        };
    }
}

在此之后,您只需要将服务与manifest.xml组合:

<service
            android:name=".NotificationService"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="your.app.domain.NotificationService" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>
zynd9foi

zynd9foi2#

您可以使用报警管理器来完成此操作[未在最新的Android版本和发布版本上进行测试,是一个相当古老的答案]。
1.使用alarmmanager在X秒后创建报警。
Intent intent =新Intent(此,AlarmReceiver.class); putExtra(“通知文本”,“一些文本”);待处理意向待处理意向=待处理意向.getBroadcast(此,分类帐Id,意向,待处理意向.FLAG_UPDATE_CURRENT);报警管理器=(报警管理器)此.getSystemService(上下文.ALARM_SERVICE);报警管理器.set(报警管理器.RTC_WAKEUP,'以毫秒为单位的X秒',未决Intent);
1.在应用中使用AlarmBroadCast接收器。
在清单文件中声明:

<receiver android:name=".utils.AlarmReceiver">
    <intent-filter>
        <action android:name="android.media.action.DISPLAY_NOTIFICATION" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

1.在广播接收器的on receive中,您可以创建通知。
公共类警报接收器扩展广播接收器{

@Override
 public void onReceive(Context context, Intent intent) {
     // create notification here
 }

}

l7mqbcuq

l7mqbcuq3#

您可以使用服务检查活动的应用程序,并在活动未运行时显示通知。

vybvopom

vybvopom4#

根据Nikhil Gupta的回答,并参考Bondolin在评论中提供的网站,向receiver添加属性android:process=":remote"允许我发布通知,即使应用程序完全关闭。

<receiver
    android:name = ".utils.AlarmReceiver"
    android:process=":remote" >  <!-- this line is important -->
</receiver>

其余的代码基本上是相同的。需要注意的一点是,类AlarmReceiver不应包含任何对MainActivity的引用,因为当应用关闭时,MainActivity类不会示例化。如果您试图在应用关闭时引用AlarmReceiver类中的MainActivity,则会抛出NullPointerException

相关问题