如何在通知上显示计时器?

2024-01-23

如何在通知上显示我的计时器?我有一个应用程序启动用户指定的计时器,我想在通知上显示计时器。即使我的应用程序已关闭,我也使用服务来运行计时器,并且我使用 SharedPreference 来传递用户设置给服务的持续时间。

这是我的代码: 第2页(片段)

public class page2 extends Fragment {
    private static final String TAG =   "page2";

    private Button btntest;
    private TextView timer,tv;
    private Spinner spinner, spinner2;
    public int hours, mins, duration;
    private Vibrator v;

    private static int myVariable;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.page2_fragment,container,false);

        btntest = (Button) view.findViewById(R.id.button2);
        timer = (TextView) view.findViewById(R.id.Timer);
        tv = (TextView) view.findViewById(R.id.textView3);

        //setting up 2 spinners
        spinner = (Spinner) view.findViewById(R.id.spinner1);
        String [] values = {"00","01","02","03","04","05","06"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_spinner_item, values);
        adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
        spinner.setAdapter(adapter);
        spinner2 = (Spinner) view.findViewById(R.id.spinner2);
        String [] values2 = {"00","01","10","20","30","40","50","60"};
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_spinner_item, values2);
        adapter2.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
        spinner2.setAdapter(adapter2);

        //button start
        btntest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String spin=spinner.getSelectedItem().toString();
                hours = Integer.parseInt(spin);
                hours = hours*3600000;
                String spin2=spinner2.getSelectedItem().toString();
                mins = Integer.parseInt(spin2);
                mins = mins*60000;
                duration = hours+mins;
                setParam(duration);
                startService(duration);
            }
        });
        return view;
    }

    //timer part
    public void setParam(int param){
         CountDownTimer countDownTimer = new CountDownTimer(param,    1000) {

            @Override
            public void onTick(long param) {
                long millis= param;
                String hms= String.format("%02d:%02d:%02d",

                        TimeUnit.MILLISECONDS.toHours(millis),
                        TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
                        //seconds
                        ,TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
                );
                timer.setText(hms);
            }

            @Override
            public void onFinish() {
                timer.setText("00:00");
            }
        };
        countDownTimer.start();
    }

    //saving data and passing intent to service
    public void startService(int duration)
    {
        int d = duration;
        SharedPreferences sharedPreferences = getActivity().getSharedPreferences("Timer", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putInt("duration", d);
        editor.apply();
        Intent intent = new Intent(getActivity(),MyService.class);
        getActivity().startService(intent);
        Toast.makeText(getActivity(), "Intent passed and preferences saved!"+d,Toast.LENGTH_SHORT).show();
    }

}

MyService.java

public class MyService extends Service {

    private Vibrator v;
    //private static Timer timer = new Timer();
    NotificationCompat.Builder notification;
    private static final int uniqueID = 71399;
    @Override
    public void onCreate() {
        super.onCreate();

        notification = new NotificationCompat.Builder(this);
        notification.setAutoCancel(true);
    }

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

        SharedPreferences sharedPreferences = getSharedPreferences("Timer", Context.MODE_PRIVATE);
        int dur = sharedPreferences.getInt("duration", 0);
        CountDownTimer countDownTimer = new CountDownTimer(dur,    1000) {

            @Override
            public void onTick(long param) {
            }

            @Override
            public void onFinish() {
                long n[] = {1,1000,500,1000,500,1000,500,1000,500,1000,500,1000,500,1000,500,1000,500,1000};
                v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(n, -1);
                startnotif();
                onDestroy();
            }
        };
        countDownTimer.start();
        return START_STICKY;
    }


    public void onDestroy() {

        stopSelf();
    }

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

    //notification
    public void startnotif()
    {
        notification.setSmallIcon(R.mipmap.ic_launcher);
        notification.setTicker("apps are now unblocked!");
        notification.setWhen(System.currentTimeMillis());
        notification.setContentTitle("You survived!");
        notification.setContentText("Apps are now unblocked!");

        Intent intent1 = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        notification.setContentIntent(pendingIntent);

        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        nm.notify(uniqueID, notification.build());

    }

}

您可以使用在创建通知之前指定的唯一通知 ID 来更新通知。

循环您的计时器(例如,从初始值减少计数器,如示例中的共享首选项)并循环每次减量并更新通知,如下所示:

mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    int numMessages = 0;
    mNotifyBuilder.setContentText(String.valueOf(timerValue))  // <-- your timer value
        .setNumber(++numMessages);
    // Because the ID remains unchanged, the existing notification is
    // updated.
    mNotificationManager.notify(
            notifyID,  // <-- Place your notification id here
            mNotifyBuilder.build());

示例根据官方文档修改:Android 中的更新通知 https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Updating

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在通知上显示计时器? 的相关文章

  • SugarORM 错误或缺少数据库

    我尝试让 Android 项目与 SugarORM 一起使用 但是 我遇到了以下错误 引起原因 android database sqlite SQLiteException 没有这样的表 DOCUMENT 代码1 编译时 INSERT O
  • 如何向 ListView 添加粘性标题?

    我有一个 listView 所以我想添加一个粘性标头 以便它粘在 listView 的顶部 当 listView 中开始不同的类别时 不同的标头会取代它 就像联系人一样 其中 a 为粘性标头位于顶部 直到 b 出现 有没有图书馆可以做 我正
  • 如何使用 Espresso 访问外部网站上的元素

    使用 espresso 我们单击 登录 按钮 该按钮将启动一个外部网站 Chrome 自定义选项卡 您可以在其中登录 然后重定向回我们的 Android 应用程序 Espresso 有没有办法 1 验证正在启动的 URL 是否正确2 访问网
  • Java中如何动态添加charsequence[]中的数据?

    初始化的一种方法charsequence is charsequence item abc def 但我不想以这种方式初始化它 有人可以建议其他方式吗 比如我们初始化的方式string arrays 首先 修复变量声明 charsequen
  • 旧 Android SDK 版本上的 java.lang.NoClassDefFoundError

    我在 Google Play 上发布了我的应用程序的一个版本 今天早上醒来时发现了一些不满意的客户 该应用程序的最新版本集成了对蓝牙低功耗 BTLE 心率监测器的支持 该应用程序在 Android 4 3 和 4 4 上运行良好 但在 4
  • Android Studio 1.2.1.1 中 Gradle 项目刷新失败

    我在全新安装的 Android Studio v 1 2 1 1 上创建了示例项目 但遇到了以下错误消息 Gradle project refresh failed in Android Studio 1 2 1 1 见下图 所以我试图在谷
  • 如何在 Android 中启用/禁用日志级别?

    例如 我有很多日志语句需要调试 Log v TAG Message here Log w TAG WARNING HERE 在设备电话上部署此应用程序时 我想关闭详细日志记录 我可以在其中启用 禁用日志记录 The Android 文档对日
  • 使用 Android Exoplayer 调整 Dash 流音量

    我正在尝试设置一个搜索栏来控制 exoplayer 流式破折号实例的级别 我正在使用的设置是演示项目的修改版本 并且无法确定我应该尝试影响搜索栏输出的哪个元素 即如何正确使用 MSG SET VOLUME 等 任何意见将不胜感激 我正在寻找
  • 对超类方法的调用应该是第一个语句吗?

    语音识别的结果可以在onActivityResult int requestCode int resultCode Intent data 方法 如图这个例子 http developer android com resources sam
  • 免费和付费版本 Android 应用程序的最佳方法?

    我开发了一个 Android 应用程序 我希望它可以作为免费版本和付费版本提供 最好的方法是什么 我可以想到三种解决方案 将项目分成两个分支并维护它们 创建一个库项目并有两个附加项目 一个 免费 版本和一个 付费 版本 使用应用内结算 问
  • 如何让android BottomAppBar圆角化

    我正在使用BottomAppBar来自谷歌这样的
  • 如何在具有多种字体大小的 TextView 中调整行高?

    我有一个包含 Spannable 字符串的 TextView 该字符串包含一堆文本 其中第一个单词的字体大小是字符串其余部分的两倍 问题在于 由于第一个字的大小增加 第一行和第二行之间的行间距比后续行之间的行间距大得多 http img s
  • 等待视图通过 IdleResource 变得可见

    我正在使用 Espresso 2 2 编写仪器测试 我想测试的流程 测试点击的单选按钮 onClick 向 API 发起请求 每次不同时间我收到回复后 积极响应触发活动中调用的接口方法 onRequestSuccess 我正在屏幕上显示名为
  • 在 Android KitKat 中接收彩信

    所以这个视频Android 4 4 短信 API http www youtube com watch v mdq0R2WQssQ DevBytes 解释了 KitKat 中 SMS API 的最新变化 他们还提供了示例项目的链接 http
  • 将字节数组保存为 Android 设备文件夹中的 jpg 文件

    我正在尝试将图像保存在 Android 设备的文件夹中 我使用的代码如下 var newFolder AndroidEnvironment GetExternalStoragePublicDirectory AndroidEnvironme
  • 如何在flutter上关注android tv应用程序中的列表视图项目

    我想在 flutter 中构建一个 android 电视应用程序 几乎所有事情都已完成 但一个问题是我无法集中注意力 例如一些弹出效果或边框更改任何告诉用户您现在正在使用此项目的内容 我们在列表视图中迭代的项目 我想要在应用程序中看到的图像
  • 如何将 SD 卡图像添加到 coverflow?

    Here is my coverflow with drawables This is my Image Adapter Code The Constant IMAGE RESOURCE IDS private static final L
  • Android Studio-公司域名

    在Android Studio中 当您创建新项目时 系统会提示您输入域名 我已经知道您可以制作一个 但是如果您想在 Google Play 商店上分发您的应用程序怎么办 即使我永远不会使用我的域 我是否需要购买一个网络域来分发我的应用程序
  • Pebble 应用程序设置中的开发人员选项

    I am following this manual http www sitepoint com pebble watch development javascript and I don t have the Developers Op
  • Android:如何获取所有可用意图过滤器的列表?

    我搜索了 Android 文档 但由于某些疯狂的原因 我无法找到所有可用意图过滤器的列表 我正在寻找一个意图过滤器 它可以执行诸如通过广播接收器通知我特定活动 例如浏览器或电子邮件 已启动或位于前台之类的操作 有人能帮我吗 PackageE

随机推荐

  • BluetoothGatt:协商新的 MTU 成功,但无法使用新的大小(相差 3 个字节)

    我正在开发一个使用 BLE 在设备之间交换数据的应用程序 为了获得更好的性能 在连接两个设备后 我正在协商增加 MTU 以便通过 BLE 交换更大的数据包 连接蓝牙设备并读取所有服务和特征后 我请求使用以下方法增加 MTU private
  • 我想为图像创建一个单独的域

    我想设置一个名为 img mydomain com 的域 这将是一个虚拟域 就像我的实际域一样 除了一个区别 它只提供以 jpg jpeg gif png 等结尾的文件 这样我就可以参考 img mydomain com some imag
  • 如何在wxFrame上设置图标?

    如何向 wxFrame 添加图标 ico 文件 我正在寻找docs http www wxpython org docs api wx Frame class html但找不到任何提及icon Thanks 凤凰wxpython frame
  • 如何访问Microsoft Speech SDK录制的音频流

    我正在使用 Microsoft 的 JavaScript 语音 SDK 转录麦克风流 录音和转录都是使用语音 SDK 完成的 我无法找到在录音完成后如何访问和保存录制的音频文件的方法 创建录音机并录音的代码 recognizer new S
  • jQuery 自定义事件到底是如何工作的

    我找不到任何关于 jquery 中的自定义事件实际实现方式的好资源 比如他们如何模拟事件冒泡等 这边走 bubbling is internal trigger function event data elem bubbling Event
  • 在 Ace 编辑器中检索字符串的行号

    我正在尝试检索 ace 编辑器中显示的文本中给定字符串的行号 示例 搜索 foo 返回 4 5 条件 ace编辑器内容中第4行和第5行包含 foo 字符串 遍历所有行并检查indexOf function findFooLineNumber
  • 使用推送通知时如何处理多个设备?

    我正在开发一个应用程序 我想在其中使用推送通知服务 我有一个服务器 现在我想知道 如何处理多个设备 每部 iPhone 都有唯一的设备 ID 名称吗 假设我想删除特定设备令牌的请求 那么如何处理多个用户呢 有没有办法通过应用程序为每个设备生
  • Angular 2 提前编译器:我必须将所有类属性公开吗?

    Angular 2 rc 6 typescript 2 node 4 5 0 npm 2 15 9 on Windows 7 我正在尝试从即时编译转向提前编译 并且我依赖这些资源 Angular 2 提前编译如何 https stackov
  • 从 OWIN 中的 OAuth Bearer Token 获取 IPrincipal

    我已使用 OWIN 成功将 OAuth 添加到我的 WebAPI 2 项目中 我收到令牌并可以在 HTTP 标头中使用它们来访问资源 现在 我想在其他通道上也使用这些令牌进行身份验证 这些通道不是 OWIN 模板所针对的标准 HTTP 请求
  • 在 Android 中使用 Jaunt 时类名冲突

    我正在尝试使用短动API http jaunt api com 根据建议使用 androidthis https stackoverflow com a 20002760 1291122所以回答 但当我运行项目时出现此错误 Could no
  • BinData() 中的十六进制而不是 base64 - MongoDB

    有没有办法将二进制值的十六进制而不是 base64 发送到 mongo 中的 BinData HexData 3 00112233445566778899aabbccddeeff or UUID 00112233445566778899aa
  • AccessibilityNodeInfo nodeInfo = event.getSource() 始终返回 null

    我正在尝试使用 AccessibilityNodeInfo 但当我使用 event getSource 时它总是返回 null 我尝试读取浏览器的编辑框 这是我的代码 public class MainActivity extends Ac
  • 将大数转换为不带科学记数法的字符串[重复]

    这个问题在这里已经有答案了 e g Number MAX VALUE toString is 1 7976931348623157e 308 我希望没有e 308 如何实现这一目标 你可以这样做 var n Number MAX VALUE
  • 处理 proguard 与 spring 时遇到困难

    我有一个使用 spring 注释扩展的 Web 应用程序 并且我的 proguard 配置如下所示 printmapping out map dontoptimize keepdirectories renamesourcefileattr
  • 使用 iOS 版 Google 地图 SDK 后应用程序大小增加

    我尝试使用适用于 iOS 的 Google Maps SDK 它似乎给我们的应用程序增加了相当大的大小 96MB 而目前应用程序的大小仅为 26MB 使用 Apple 地图 我将不胜感激任何有关如何解决的反馈 经验 没有办法解决这个问题 这
  • 在onCreate中从TextLayout获取Bitmap

    我能够转换Layout with a TextView into a Bitmap 只要事件发生after onCreate 但当我尝试时during在创建时 它不起作用 有办法让它发挥作用吗 我尝试过使用inflate 以各种方式 没有喜
  • WSO2 API Manager 身份验证错误内容类型

    我配置了 WSO2 API Manager 一切似乎都工作正常 唯一困扰我的问题是 如果出现 Auth 异常 API 管理器总是返回 XML 内容类型的响应 例如
  • IntelliJ 调试器卡住

    我正在调试一个普通的 Java 应用程序 没有 GUI 只有大量计算和主线程堆栈中的约 5 个调用 当问题发生时 基本上它一直在局部变量监视中显示 正在收集数据 So instead of going step by step I ve t
  • 在当前进程中通过python运行bat文件

    我正在尝试通过 python 脚本构建一个大型系统 我首先需要设置 Visual Studio 的环境 遇到问题后 我决定看看是否可以设置并启动 Visual Studio 我首先设置几个环境变量 然后调用C Program Files x
  • 如何在通知上显示计时器?

    如何在通知上显示我的计时器 我有一个应用程序启动用户指定的计时器 我想在通知上显示计时器 即使我的应用程序已关闭 我也使用服务来运行计时器 并且我使用 SharedPreference 来传递用户设置给服务的持续时间 这是我的代码 第2页