`
zxl_ong
  • 浏览: 128564 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ConditionVariable控制通知栏消息变更

阅读更多
ConditionVariable介绍:
ConditionVariable类位于android.os.ConditionVariable,它可以帮助Android线程同步。在SDK上的介绍ConditionVariable不同于标准Java位于java.lang.Object wait() 和 notify() ,这个类可以等待自己,这就意味着 open(), close() 和 block() 可能会假死 ,如果使用ConditionVariable类的open()在调用 block() 之前, block() 将不会阻塞,相反将会返回立即。

该类一共有4个方法

boolean  block(long timeout)
阻止当前线程知道条件是open,或直到超时,这里参数long timeout为超时设置,Android123提示大家如果你们从事过Win32开发,这个方法类似DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); 函数。

void  block()
阻止当前线程知道条件 open ,是上面的无超时等待重载版本。

void  close()
重置条件为 close状态。

void  open()
Open条件,释放所有线程的阻塞.

ConditionVariable 在创建时还有一种构造方法是 public ConditionVariable (boolean state) ,如果为true,默认时为opened,如果为false则是closed. ,默认public ConditionVariable()为closed.

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.apis.app;

// Need the following import to get access to the app resources, since this
// class is in a sub-package.
import com.example.android.apis.R;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.ConditionVariable;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.widget.RemoteViews;

/**
 * This is an example of service that will update its status bar balloon 
 * every 5 seconds for a minute.
 * 
 */
public class NotifyingService extends Service {
    
    // Use a layout id for a unique identifier
    private static int MOOD_NOTIFICATIONS = R.layout.status_bar_notifications;

    // variable which controls the notification thread 
    private ConditionVariable mCondition;
 
    @Override
    public void onCreate() {
        mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        // Start up the thread running the service.  Note that we create a
        // separate thread because the service normally runs in the process's
        // main thread, which we don't want to block.
        Thread notifyingThread = new Thread(null, mTask, "NotifyingService");
        mCondition = new ConditionVariable(false);
        notifyingThread.start();
    }

    @Override
    public void onDestroy() {
        // Cancel the persistent notification.
        mNM.cancel(MOOD_NOTIFICATIONS);
        // Stop the thread from generating further notifications
        mCondition.open();
    }

    private Runnable mTask = new Runnable() {
        public void run() {
            for (int i = 0; i < 4; ++i) {
                showNotification(R.drawable.stat_happy,
                        R.string.status_bar_notifications_happy_message);
                if (mCondition.block(5 * 1000)) 
                    break;
                showNotification(R.drawable.stat_neutral,
                        R.string.status_bar_notifications_ok_message);
                if (mCondition.block(5 * 1000)) 
                    break;
                showNotification(R.drawable.stat_sad,
                        R.string.status_bar_notifications_sad_message);
                if (mCondition.block(5 * 1000)) 
                    break;
            }
            // Done with our work...  stop the service!
            NotifyingService.this.stopSelf();
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    
    private void showNotification(int moodId, int textId) {
        // In this sample, we'll use the same text for the ticker and the expanded notification
        CharSequence text = getText(textId);

        // Set the icon, scrolling text and timestamp.
        // Note that in this example, we pass null for tickerText.  We update the icon enough that
        // it is distracting to show the ticker text every time it changes.  We strongly suggest
        // that you do this as well.  (Think of of the "New hardware found" or "Network connection
        // changed" messages that always pop up)
        Notification notification = new Notification(moodId, null, System.currentTimeMillis());

        // The PendingIntent to launch our activity if the user selects this notification
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, NotifyingController.class), 0);

        // Set the info for the views that show in the notification panel.
        notification.setLatestEventInfo(this, getText(R.string.status_bar_notifications_mood_title),
                       text, contentIntent);

        // Send the notification.
        // We use a layout id because it is a unique number.  We use it later to cancel.
        mNM.notify(MOOD_NOTIFICATIONS, notification);
    }

    // This is the object that receives interactions from clients.  See
    // RemoteService for a more complete example.
    private final IBinder mBinder = new Binder() {
        @Override
        protected boolean onTransact(int code, Parcel data, Parcel reply,
                int flags) throws RemoteException {
            return super.onTransact(code, data, reply, flags);
        }
    };

    private NotificationManager mNM;
}
分享到:
评论

相关推荐

    Linux系统中进程和线程的通信方式总结

    - 条件变量(ConditionVariable):条件变量与互斥锁配合使用,允许线程因为某些条件未达成而进入休眠,直到其他线程改变条件,并发出信号唤醒等待该条件的线程。 - 读写锁(Read-WriteLock):读写锁允许多个线程...

    Android编程使用Service实现Notification定时发送功能示例

    // 状态栏通知的管理类对象,负责发通知、清楚通知等 private NotificationManager mNM; // 使用 Layout 文件的对应 ID 来作为通知的唯一识别 private static int MOOD_NOTIFICATIONS = R.layout.status_bar_...

    操作系统实验:生产者消费者

    在VC中,可以使用`ConditionVariable`类来实现条件变量的等待和唤醒。 6. **死锁**:如果处理不当,生产者消费者问题可能会引发死锁。例如,所有生产者都在等待缓冲区空间,而所有消费者都在等待缓冲区数据,系统就...

    Working with Ruby Threads(完整版)

    3. **线程同步**:由于线程间的共享数据可能导致竞态条件,Ruby提供了几种同步机制,包括`Mutex`(互斥锁)、`ConditionVariable`(条件变量)和`MonitorMixin`(监视器)。这些工具用于确保在任何时候只有一个线程访问...

    c#多线程示例

    线程间通信用于协调不同线程的行为,如通过WaitHandle(如ManualResetEvent、AutoResetEvent)或条件变量(ConditionVariable)。这些工具可以帮助线程在特定条件满足时进行同步。 总结,"c#多线程示例"项目中的...

    PV操作程序

    在操作系统中,PV操作,即P操作(Wait或Acquire)和V操作(Signal或Release),是用于控制并发进程同步的重要机制,由荷兰计算机科学家Edsger Dijkstra提出。PV操作基于信号量Semaphore,它是实现多线程和多进程同步...

    nachos Lab3实习报告

    通过这些练习,学生不仅能够深入理解Linux和其他操作系统中的同步机制,还能够学会如何在自己的项目中正确地应用这些机制,以实现高效的并发控制。此外,这些知识对于未来的软件开发和系统设计工作都极为重要。

    cocos2d-x多线程

    Cocos2d-x提供了一些机制来保证线程安全,如`CCThread`类用于管理线程,`Mutex`(互斥锁)和`ConditionVariable`(条件变量)用于同步线程,确保数据访问的一致性。 4. **调度器(Scheduler)**:Cocos2d-x的调度器是...

    zthread2.3.2 代码和lib

    通过`Thread`类,开发者可以方便地启动新的线程,指定执行函数及其参数,同时还能获取线程ID,控制线程的生命周期(如暂停、恢复、等待和终止)。 2. **同步机制**:zthread提供了多种同步工具,如`Mutex`(互斥锁...

    example.rar

    此外,一个好的多线程模板还会考虑线程间通信,如使用WaitHandle(如ManualResetEvent、AutoResetEvent)、ConditionVariable或TaskCompletionSource等机制,来协调线程间的执行顺序或等待特定事件的发生。...

    muduo网络库

    8. **MutexLock, ConditionVariable**: muduo库还提供了线程同步的工具,如MutexLock和ConditionVariable,以确保在多线程环境中的正确同步。 通过muduo网络库,开发者可以轻松构建高性能、高并发的服务器应用,...

    基于C++的跨平台多媒体基础库设计源码

    该项目是一款基于C++的多媒体基础库...该库提供媒体处理所需的公共能力,包括AVFormat、AVBuffer和AVBufferQueue的封装,跨平台的Task、Mutex、AutoLock和ConditionVariable接口封装,插件管理机制以及Pipeline机制。

    ruby-2.7.1.zip

    至于Redis集群,这是一个分布式键值存储系统,常用于缓存、消息队列和数据库。Ruby社区有官方的`redis`客户端库,使得Ruby开发者可以轻松地与Redis服务器交互。在搭建Redis集群时,使用Ruby作为客户端语言非常方便,...

    ruby 知识总结

    2. **Mutex 和 ConditionVariable 结合**:ConditionVariable(条件变量)允许线程等待特定条件满足后继续执行。一个线程调用 `wait`(通常与指定的Mutex一起使用),进入等待状态,直到其他线程调用 `signal` 或 `...

    C#多线程编程实战Code源代码

    WaitHandle(如EventWaitHandle、AutoResetEvent、ManualResetEvent)和条件变量(ConditionVariable)是线程间通信的重要工具,它们可以用于线程间的信号传递,实现线程的唤醒和等待。 九、线程局部存储 ...

    mulThread.rar_vc++.net 线程

    条件变量(`std::condition_variable`或`ConditionVariable`)则是在线程间同步的另一种方式,允许线程等待特定条件满足后再继续执行。 5. **线程局部存储**: 在多线程程序中,有时需要每个线程拥有自己的数据副本...

    ruby_1_9_3_stdlib_rdocs.gz

    核心库是 Ruby 语言的基础,包括基本的数据类型(如字符串、数组、哈希)、控制结构(如循环、条件语句)以及对象模型等。扩展库则是一系列附加的功能,如文件系统操作、进程管理、XML 解析等,它们增强了 Ruby 的...

Global site tag (gtag.js) - Google Analytics