常用的应用程序调用
intent-filter
1 android.intent.action.MAIN决定应用程序最先启动的Activity。
2 android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里。
intent调用应用程序
例子: 调用Google浏览器
Uri uri = Uri.parse("http://www.android123.com.cn");
Intent it = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);
显示web网页:
1. Uri uri = Uri.parse("http://www.android123.com.cn");
2. Intent it = new Intent(Intent.ACTION_VIEW,uri);
3. startActivity(it);
显示google地图:
1. Uri uri = Uri.parse("geo:38.899533,-77.036476");
2. Intent it = new Intent(Intent.Action_VIEW,uri);
3. startActivity(it);
Maps路径规划:
1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
2. Intent it = new Intent(Intent.ACTION_VIEW,URI);
3. startActivity(it);
拨打电话:
1. Uri uri = Uri.parse("tel:xxxxxx");
2. Intent it = new Intent(Intent.ACTION_DIAL, uri);
3. startActivity(it);
1. Uri uri = Uri.parse("tel.xxxxxx");
2. Intent it =new Intent(Intent.ACTION_CALL,uri);
注意需要权限 <uses-permission id="Android.permission.CALL_PHONE" />
发送SMS/MMS
1. Intent it = new Intent(Intent.ACTION_VIEW);
2. it.putExtra("sms_body", "android开发网欢迎您");
3. it.setType("vnd.android-dir/mms-sms");
4. startActivity(it);
发送短信
1. Uri uri = Uri.parse("smsto:10086");
2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
3. it.putExtra("sms_body", "10086"); //正文 10086
4. startActivity(it);
发送彩信
1. Uri uri = Uri.parse("content://media/external/images/media/10"); //该Uri根据实际情况修改,external代表外部存储即sdcard
2. Intent it = new Intent(Intent.ACTION_SEND);
3. it.putExtra("sms_body", "android123.com.cn");
4. it.putExtra(Intent.EXTRA_STREAM, uri);
5. it.setType("image/png");
6. startActivity(it);
发送Email
2. Uri uri = Uri.parse("mailto:android123@163.com");
3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
4. startActivity(it);
1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_EMAIL, "android123@163.com");
3. it.putExtra(Intent.EXTRA_TEXT, "android开发网测试");
4. it.setType("text/plain");
5. startActivity(Intent.createChooser(it, "选择一个Email客户端"));
1. Intent it=new Intent(Intent.ACTION_SEND);
2. String[] tos={"android123@163.com"}; //发送到
3. String[] ccs={"ophone123@163.com"}; //抄送
4. it.putExtra(Intent.EXTRA_EMAIL, tos);
5. it.putExtra(Intent.EXTRA_CC, ccs);
6. it.putExtra(Intent.EXTRA_TEXT, "正文");
7. it.putExtra(Intent.EXTRA_SUBJECT, "标题");
8. it.setType("message/rfc822"); //编码类型
9. startActivity(Intent.createChooser(it, "选择一个Email客户端"));
Email添加附件
1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_SUBJECT, "正文");
3. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/nobody.mp3"); //附件为sd卡上的nobody MP3文件
4. sendIntent.setType("audio/mp3");
5. startActivity(Intent.createChooser(it, "选择一个Email客户端"));
播放多媒体
1.
2. Intent it = new Intent(Intent.ACTION_VIEW);
3. Uri uri = Uri.parse("file:///sdcard/nobody.mp3");
4. it.setDataAndType(uri, "audio/mp3");
5. startActivity(it);
1. Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); //从系统内部的MediaProvider索引中调用播放
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);
Uninstall卸载程序
1. Uri uri = Uri.fromParts("package", packageName, null); //packageName为包名,比如com.android123.apkInstaller
2. Intent it = new Intent(Intent.ACTION_DELETE, uri);
3. startActivity(it);
进入联系人界面
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);
查看某个联系人,当然这里是ACTION_VIEW,如果为选择并返回action改为ACTION_PICK,当然处理intent时返回需要用到startActivityforResult
Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, ID);//最后的ID参数为联系人Provider中的数据库BaseID,即哪一行
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);
选择一个图片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, 0);
调用Android设备的照相机,并设置拍照后存放位置
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+"/cwj", android123 + ".jpg"))); //存放位置为sdcard卡上cwj文件夹,文件名为android123.jpg格式
startActivityForResult(intent, 0);
转自:http://blog.csdn.net/yiyaaixuexi/archive/2011/04/21/6337760.aspx
public class hello extends Activity {
/** Called when the activity is first created. */
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new Handler();
SharedPreferences prefs = getPreferences(0);
long lastUpdateTime = prefs.getLong("lastUpdateTime", System.currentTimeMillis());
int curVersion = 0;
try {
curVersion = getPackageManager().getPackageInfo("linhai.com.hello", 0).versionCode;
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i("DEMO",String.valueOf(curVersion));
if ((lastUpdateTime + (24 * 60 * 60 * 1000)) < System.currentTimeMillis()) {
lastUpdateTime = System.currentTimeMillis();
SharedPreferences.Editor editor = getPreferences(0).edit();
editor.putLong("lastUpdateTime", lastUpdateTime);
editor.commit();
// checkUpdate.start();
}
}
private Thread checkUpdate = new Thread(){
public void run() {
try {
URL updateURL = new URL("http://my.company.com/update");
URLConnection conn = updateURL.openConnection();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while((current = bis.read()) != -1){
baf.append((byte)current);
}
final String s = new String(baf.toByteArray());
int curVersion = getPackageManager().getPackageInfo("your.app.id", 0).versionCode;
int newVersion = Integer.valueOf(s);
if (newVersion > curVersion) {
mHandler.post(showUpdate);
}
} catch (Exception e) {
}
}
};
private Runnable showUpdate = new Runnable(){
public void run(){
new AlertDialog.Builder(hello.this).setIcon(R.drawable.ok).setTitle("Update Available")
.setMessage("An update for is available!\n\nOpen Android Market and see the details?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:your.app.id"));
startActivity(intent);
}
}).setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}).show();
}
};
}
程序需要相应用户的操作,最要能在200ms(0.2s)之内,如果超过5秒没有反应,ActivityManager会没有提示就kill了 activity。然而,activity可能真的需要时间来进行处理,这往往会用到后台线程-background thread。后台线程可以安全 地和UI线程进行交互,其中后台线程是不能修改UI的。
通过创建一个Handler子类的对象,每个acvivity只需一个Handler对象。后台进程可通过两种方式Handler进行通信:message和Runnable对象,其结果实质都是将在Handler的队列中放入内容,message是放置信息,可以传递一些参数,Handler获取这些信息并将判度如何处理,而Runnable则是直接给出处理的方法。
这些队列中的内容(无论Message还是Runnable)可以要求马上执行,延迟一定时间执行或者指定某个时刻执行,如果将他们放置在队列头,则表示具有最高有限级别,立即执行。这些函数包括有:sendMessage(), sendMessageAtFrontOfQueue(), sendMessageAtTime(), sendMessageDelayed()以及用于在队列中加入Runnable的post(), postAtFrontOfQueue(), postAtTime(),postDelay()。
一般而言,推荐是Messge方式,这样程序设计得可以更为灵活,而Runnable在某些简单明确的方式中使用。我们将通过三种方法编写一个小例子来学习。这个例子是一个进度条,每隔1秒,进度条步进5,如果acvity停止时,进度条归零。
Android XML :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ...... />
<ProgressBar android:id="@+id/c15_progress"
<!-- 这表明采用传统水平进度条的方式-->
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
例子一:线程开启,采用Message传递后台线程和UI主线程之间的信息
public class Chapter15Test1 extends Activity{
private ProgressBar bar = null;
private boolean isRunning = false;
/* 我们为这个Acivity创建一个用于和后台程序通信的handler,简单地,只要一收到message,就将progressbar进度增加5。*/
/* 步骤1:创建Handler,并通过handleMessage()给出当收到消息是UI需要进行如何处理,例子简单不对msg的内容进行分析*/
Handler handler= new Handler(){
public void handleMessage (Message msg) {
bar.incrementProgressBy(5);
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chapter_15_test1);
bar=(ProgressBar)findViewById(R.id.c15_progress);
}
/*on Start是UI初始化并显示时调用*/
protected void onStart() {
super.onStart();
bar.setProgress(0);
/*步骤2:建立后台线程处理,采用Thread,其中run()的内容,就是线程并行处理的内容,Thread是Runnable的implements*/
Thread background = new Thread(new Runnable(){
public void run () {
try{
for(int i = 0; i < 20 && isRunning; i ++){
Thread.sleep(1000);
/* 步骤2.1:发送Message到队列中,参数中的obtainMessage()是用于给出一个新Message,本例无参数,对应的在handler在队列中收到这条消息时,则通过handleMessage()进行处理*/
handler.sendMessage (handler.obtainMessage ());
}
}catch(Throwable t){
//jest end the thread
}
}
});
isRunning = true;
/*步骤3:启动线程*/
background.start();
}
/*onStop是UI停止显示时调用,例如我们按了返回键*/
protected void onStop() {
super.onStop();
isRunning = false;
}
}
例子2:采用Runnable
我们在上面的例子的基础上进行修改,如下
/*步骤1:由于不需要处理Message,也即不需要处理handleMessage()*/
Handler handler= new Handler();
/*步骤1.1:定义处理动作,采用Runnable的实例,通过implements run()来定制处理,这里是简单将进度条步进5。由于我们将在Thread中使用这个实例,所以考虑采用final的方式*/
final Runnable r = new Runnable() {
public void run(){
bar.incrementProgressBy(5);
}
};
/* ... ...在onStart()中的步骤2:线程的处理,和提供message不同,对于runnable方式,采用post */
Thread background = new Thread(new Runnable(){
public void run() {
try{
for(int i = 0; i < 20 && isRunning; i ++){
Thread.sleep(1000);
handler.post(r);
}
}catch(Throwable t){
//jest end the thread
}
}
});
background.start();
例子3:可以用延迟处理实现定时触发,让程序更为简单
在这里例子,事实我们是进行定时的处理,利用Handler队列可以设置延期处理的方式,我们并不需要创建一个后台运行的线程,也可以实现
Handler handler= new Handler();
... ... 在onStart() ... ...
//利用handler.postDelayed(r,1000),在队列中加入1秒后,进行r的处理,而在r的处理中,最后在handler的队列中加入一个延迟1秒的处理,如是,就可以每隔1秒进行一次处理。
handler.postDelayed(new Runnable() {
public void run() {
if(isRunning && Chapter15Test2.step < 20){
step ++;
bar.incrementProgressBy(5);
handler.postDelayed(this, 1000);
}
}
},1000 );