当前位置:  编程技术>移动开发
本页文章导读:
    ▪护持屏幕一直亮        保持屏幕一直亮  public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);    } ......
    ▪ NotificationManager与Notification的施用        NotificationManager与Notification的应用 本博客内容选摘自《Google Android SDK 开发范例大全》第五章第8节(第170页),如需详细了解请查看原书籍   下面通过模拟MSN在线状态的切换,在切换状态时.........
    ▪ 播放器初记 + Timer和TimerTask详解       播放器小记 + Timer和TimerTask详解 今天做的是播放器的进度条,使用的是seekbar控件,在网上搜索了一下关于seekbar的使用方法,除了定时器的使用上有所区别,其他都大同小异尝试了两种用.........

[1]护持屏幕一直亮
    来源: 互联网  发布时间: 2014-02-18
保持屏幕一直亮

 public void onCreate(Bundle savedInstanceState) {
 

 super.onCreate(savedInstanceState);
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

 

 }


    
[2] NotificationManager与Notification的施用
    来源: 互联网  发布时间: 2014-02-18
NotificationManager与Notification的应用

本博客内容选摘自《Google Android SDK 开发范例大全》第五章第8节(第170页),如需详细了解请查看原书籍

 

下面通过模拟MSN在线状态的切换,在切换状态时改变状态栏上的状态小图标和提示文本的示例来学习NotificationManager与Notification的应用。

代码如下:

 

StateBarNotifyActivity.java

package com.st;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class StateBarNotifyActivity extends Activity {
	
	private NotificationManager nm = null;
	private Spinner spinner = null;
	private ArrayAdapter<String> adapter = null;
	
	private static final String ONLINE="在线";
	private static final String BUSY="忙碌";
	private static final String AWAY="离开";
	private static final String OFFLINE="离线";
	
	private static final String[]stateList = {ONLINE,BUSY,AWAY,OFFLINE};
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        
        spinner = (Spinner)findViewById(R.id.spinner);
        nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, stateList);
        spinner.setAdapter(adapter);
        
        spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				Log.i("OnItemSelectedListener", "position="+position+", id="+id);
				if(stateList[position].equals(ONLINE)){
					setNotifyType(R.drawable.online,ONLINE);
				}else if(stateList[position].equals(BUSY)){
					setNotifyType(R.drawable.busy,BUSY);
				}else if(stateList[position].equals(AWAY)){
					setNotifyType(R.drawable.away,AWAY);
				}else if(stateList[position].equals(OFFLINE)){
					setNotifyType(R.drawable.offline,OFFLINE);
				}
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				// TODO Auto-generated method stub
				
			}

			
		});
        
    }

    /**
     * 发出通知
     * */
	protected void setNotifyType(int statePngId, String showText) {
		// TODO Auto-generated method stub
		
		Intent notifyIntent = new Intent(this,NotifyActivity.class);
		notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		
		PendingIntent pintent = PendingIntent.getActivity(this, 0, notifyIntent, 0);
		
		Notification notification = new Notification();
		
		notification.icon = statePngId;//设置图标
		notification.tickerText = showText;//设置文本提示
		notification.defaults = Notification.DEFAULT_LIGHTS;//设置默认声音-Notification.DEFAULT_SOUND,还可以是其他的值:屏幕发亮-Notification.DEFAULT_LIGHTS;手机震动-Notification.DEFAULT_VIBRATE;包含以上三种动作-Notification.DEFAULT_ALL
		notification.setLatestEventInfo(this, "MSN登录状态", showText, pintent);
		
		//发出通知
		nm.notify(0, notification);
	}
}

 

 NotifyActivity.java

package com.st;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class NotifyActivity extends Activity {

	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		Toast.makeText(this, "这是模拟MSN登录状态的程序", Toast.LENGTH_LONG).show();
		finish();
	}
}

 

 main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    
    <Spinner
    	android:id="@+id/spinner"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	>
    </Spinner>
</LinearLayout>

 

 strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">模拟MSN切换登录状态的程序</string>
    <string name="app_name">StateBarNotify</string>
</resources>

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.st"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".StateBarNotifyActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity android:name=".NotifyActivity"></activity>

    </application>


</manifest> 

  

 


    
[3] 播放器初记 + Timer和TimerTask详解
    来源: 互联网  发布时间: 2014-02-18
播放器小记 + Timer和TimerTask详解
今天做的是播放器的进度条,使用的是seekbar控件,在网上搜索了一下关于seekbar的使用方法,除了定时器的使用上有所区别,其他都大同小异
尝试了两种用法,创建一个runnable,和使用Timer,大概都是启动一个线程刷新进度条位置吧,具体的不明真相。。
最后觉得还是用Timer定时器比较方便一点
只需如下代码
						mTimer = new Timer();
	mTimerTask = new TimerTask() {
							@Override
							public void run() {
								Log.v(TAG, "runSeekbar");
								// TODO Auto-generated method stub
								skb.setProgress(myService.mPlayer
										.getCurrentPosition());
							}
						};
						mTimer.schedule(mTimerTask,0,1000);


运行时发现,不管这种方法还是手动建立Runable,都会让音乐播放的时候不连续。。可是不这么做还有什么优化些的方法嘛?
---------------------------
11.17更新
onProgressChanged方法用于监听seekbar变化,但是不是用来控制mediaplayer的,之前把控制播放进度放在了这个方法里,这样线程控制进度条时就调用乐此方法,导致音乐播放发生回退现象
onStartTrackingTouch()和onStopTrackingTouch()才是用于手动调节播放进度的,我们常常把手动调节进度放在onStopTrackingTouch()中。
还以为是性能问题呢,搞了个半天。。。
---------------------------

我的播放器现在也有点播放器的样子了,在这记录一下,目前功能包括,播放暂停停止,后台播放,进度条拖动
明天加入:循环播放设置,上一首下一首,播放列表功能
PS:关于List的相关知识还需要加强。。。学习android还是得靠动手,进步很明显,心情不错~

今天学习过程中顺道又查阅了一下Timer相关用法,转过来做个记录,关于线程方面还需要加强~


以下为转载:
==============================
1.概览
Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

简单的一个例程:


import java.util.Timer;
import java.util.TimerTask;

/**
* Simple demo that uses java.util.Timer to schedule a task to execute
* once 5 seconds have passed.
*/

public class Reminder {
    Timer timer;

    public Reminder(int seconds) {
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000);
    }

    class RemindTask extends TimerTask {
        public void run() {
            System.out.println("Time's up!");
            timer.cancel(); //Terminate the timer thread
        }
    }

    public static void main(String args[]) {
        System.out.println("About to schedule task.");
        new Reminder(5);
        System.out.println("Task scheduled.");
    }
}

运行这个小例子,你会首先看到:

About to schedule task.

5秒钟之后你会看到:

Time's up!

这个小例子可以说明一些用Timer线程实现和计划执行一个任务的基础步骤:
•实现自定义的TimerTask的子类,run方法包含要执行的任务代码,在这个例子里,这个子类就是RemindTask。
•实例化Timer类,创建计时器后台线程。
•实例化任务对象 (new RemindTask()).
•制定执行计划。这里用schedule方法,第一个参数是TimerTask对象,第二个参数表示开始执行前的延时时间(单位是milliseconds,这里定义了5000)。还有一种方法可以指定任务的执行时间,如下例,指定任务在11:01 p.m.执行:

//Get the Date corresponding to 11:01:00 pm today.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0);
Date time = calendar.getTime();

timer = new Timer();
timer.schedule(new RemindTask(), time);


2.终止Timer线程
默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:


•调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里。
•让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。
•当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。
•调用System.exit方法,使整个程序(所有线程)终止。
Reminder的例子使用了第一种方式。在这里不能使用第二种方式,因为这里需要程序保持运行直到timer的任务执行完成,如果设成daemon,那么当main线程结束的时候,程序只剩下timer这个daemon线程,于是程序不会等timer线程执行task就终止了。

有些时候,程序的终止与否并不只与timer线程有关。举个例子,如果我们使用AWT来beep,那么AWT会自动创建一个非daemon线程来保持程序的运行。下面的代码我们对Reminder做了修改,加入了beeping功能,于是我们需要加入System.exit的调用来终止程序。





import java.util.Timer;
import java.util.TimerTask;
import java.awt.Toolkit;

/**
* Simple demo that uses java.util.Timer to schedule a task to execute
* once 5 seconds have passed.
*/

public class ReminderBeep {
    Toolkit toolkit;
    Timer timer;

    public ReminderBeep(int seconds) {
        toolkit = Toolkit.getDefaultToolkit();
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000);
    }

    class RemindTask extends TimerTask {
        public void run() {
            System.out.println("Time's up!");
    toolkit.beep();
    //timer.cancel(); //Not necessary because we call System.exit
    System.exit(0);   //Stops the AWT thread (and everything else)
        }
    }

    public static void main(String args[]) {
System.out.println("About to schedule task.");
        new ReminderBeep(5);
System.out.println("Task scheduled.");
    }
}



3.反复执行一个任务

先看一个例子:

public class AnnoyingBeep {
    Toolkit toolkit;
    Timer timer;

    public AnnoyingBeep() {
        toolkit = Toolkit.getDefaultToolkit();
        timer = new Timer();
        timer.schedule(new RemindTask(),
               0,        //initial delay
               1*1000);  //subsequent rate
    }

    class RemindTask extends TimerTask {
        int numWarningBeeps = 3;

        public void run() {
            if (numWarningBeeps > 0) {
                toolkit.beep();
                System.out.println("Beep!");
                numWarningBeeps--;
            } else {
                toolkit.beep();
                System.out.println("Time's up!");
                //timer.cancel(); //Not necessary because we call System.exit
                System.exit(0);   //Stops the AWT thread (and everything else)
            }
        }
    }
    ...
}

执行,你会看到如下输出:

Task scheduled.
Beep!     
Beep!      //one second after the first beep
Beep!      //one second after the second beep
Time's up! //one second after the third beep

这里使用了三个参数的schedule方法用来指定task每隔一秒执行一次。如下所列为所有Timer类用来制定计划反复执行task的方法 :
•schedule(TimerTask task, long delay, long period)
•schedule(TimerTask task, Date time, long period)
•scheduleAtFixedRate(TimerTask task, long delay, long period)
•scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
当计划反复执行的任务时,如果你注重任务执行的平滑度,那么请使用schedule方法,如果你在乎的是任务的执行频度那么使用scheduleAtFixedRate方法。 例如,这里使用了schedule方法,这就意味着所有beep之间的时间间隔至少为1秒,也就是说,如果有一个beap因为某种原因迟到了(未按计划执行),那么余下的所有beep都要延时执行。如果我们想让这个程序正好在3秒以后终止,无论哪一个beep因为什么原因被延时,那么我们需要使用scheduleAtFixedRate方法,这样当第一个beep迟到时,那么后面的beep就会以最快的速度紧密执行(最大限度的压缩间隔时间)。

4.进一步分析schedule和scheduleAtFixedRate


(1)2个参数的schedule在制定任务计划时, 如果指定的计划执行时间scheduledExecutionTime<=systemCurrentTime,则task会被立即执行。scheduledExecutionTime不会因为某一个task的过度执行而改变。
(2)3个参数的schedule在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间随着前一次的实际执行时间而变,也就是scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是说如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),则此时不做时隔等待,立即执行第n+1次task,而接下来的第n+2次task的scheduledExecutionTime(第n+2次)就随着变成了realExecutionTime(第n+1次)+periodTime。说白了,这个方法更注重保持间隔时间的稳定。
(3)3个参数的scheduleAtFixedRate在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间在最初就被定下来了,也就是scheduledExecutionTime(第n次)=firstExecuteTime+n*periodTime;如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),则此时不做period间隔等待,立即执行第n+1次task,而接下来的第n+2次的task的scheduledExecutionTime(第n+2次)依然还是firstExecuteTime+(n+2)*periodTime这在第一次执行task就定下来了。说白了,这个方法更注重保持执行频率的稳定。



5.一些注意的问题
•每一个Timer仅对应唯一一个线程。
•Timer不保证任务执行的十分精确。
•Timer类的线程安全的。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ahxu/archive/2005/01/12/249610.aspx

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现Back功能代码片段总结 iis7站长之家
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3