android - 在android中每2分钟显示一次 toast 的后台服务

标签 android service broadcastreceiver alarmmanager

我正在编写一个在后台执行某些操作(即服务)的小型 Android 应用程序,我希望它在每隔“x”分钟后显示一条消息。我如何使用广播监听器和警报管理器来完成它。有人可以写一个示例代码来演示它吗。

最佳答案

您可以通过在 Service 类中使用 TimerTimerTask 轻松地做到这一点。

1. 在您的 Service 类中,首先创建一个内部类 DisplayToastTimerTask 扩展自 TimerTask 以显示Toast 消息。您必须将 HandlerRunnable 一起使用才能显示 TimerTask 中的 Toast:

private class DisplayToastTimerTask extends TimerTask {

    Handler mHandler = new Handler();

    @Override
    public void run() {

        // Do something....

        mHandler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), 
                               "Hello world", Toast.LENGTH_SHORT).show();
            }
        });

    }
}

2.使用Timer调度DisplayToastTimerTask2分钟的间隔重复执行

private static final int TIMER_INTERVAL = 120000; // 2 Minute
private static final int TIMER_DELAY = 0;

// Create new Timer
Timer mTimer = new Timer();
mTimer.scheduleAtFixedRate(new DisplayToastTimerTask(), TIMER_DELAY, TIMER_INTERVAL);

示例:

#. 下面是完整的 Service 类:**

//MyService.java

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;
import java.util.Timer;
import java.util.TimerTask;

public class MyService extends Service {

    private Timer mTimer;
    private Handler mHandler = new Handler();

    private static final int TIMER_INTERVAL = 120000; // 2 Minute
    private static final int TIMER_DELAY = 0;

    @Override
    public void onCreate() {
        super.onCreate();

        if (mTimer != null)
            mTimer = null;

        // Create new Timer
        mTimer = new Timer();

        // Required to Schedule DisplayToastTimerTask for repeated execution with an interval of `2 min`
        mTimer.scheduleAtFixedRate(new DisplayToastTimerTask(), TIMER_DELAY, TIMER_INTERVAL);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        return Service.START_STICKY;
    }

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

    @Override
    public void onDestroy() {
        super.onDestroy();

        // Cancel timer
        mTimer.cancel();
    }

    // Required to do some task
    // Here I just display a toast message "Hello world"
    private class DisplayToastTimerTask extends TimerTask {

        @Override
        public void run() {

            // Do something....

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), "Hello world", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
}

#. 您可以像下面这样启动您的服务:

Intent intentMyService = new Intent(context, MyService.class);
mContext.startService(intentMyService);

#. 不要忘记将 MyService 类声明到 AndroidManifest.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application>

        <service android:name=".MyService" />

    </application>
</manifest>

希望对你有帮助~

关于android - 在android中每2分钟显示一次 toast 的后台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11066057/

相关文章:

android - 调用 stopService 后服务正在运行

android - BroadcastReceiver SharedPreferences 只是不可靠

java - Firebase Android PhoneAuthProvider 内存泄漏

android - 如何将数据从另一个 fragment 开始的 fragment 传输到 Activity

java - 方法不支持请求正文: GET/POST

android - 加速度计似乎只能工作几秒钟?

android - 正确使用后台服务/广播接收器

Android 模拟器找不到我的 Java 类?

显示 toast 的 Android 服务

unix - 从 C/C++ 应用程序启动 systemd 服务或调用 D-Bus 服务