您的位置:首页 > 移动开发 > Android开发

Android 使用Component跨应用程序访问

2015-09-04 09:19 537 查看
Android Component跨应用程序访问,就是打开其他应用程序的activity。里面有两个项目,安装包。因为测试一个应用程序打开另外一个应用程序,所以测试需要同时安装这两个。在打开其他应用程序的activity还可携带数据,和返回数据。下载地址:点击

主要看下面代码,有注释说明。那么先看demo的效果图:

一、实现效果



二、看主要代码

package com.example.activity;

import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 测试跨应用程序访问activity,并携带数据并返回数据
 * @author Administrator
 *
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initView();
	}

	//初始化UI
	private void initView() {
		Button mainButton = (Button)findViewById(R.id.button1);
		Button secondButton = (Button)findViewById(R.id.button2);
		mainButton.setOnClickListener(new ButtonOnclick());
		secondButton.setOnClickListener(new ButtonOnclick());
	}

	/**
	 * button按键监听类
	 * @author Administrator
	 *
	 */
	private class ButtonOnclick implements OnClickListener{
		@Override
		public void onClick(View v) {
			int id = v.getId();
			switch (id) {
			case R.id.button1: // 访问主界面
				ComponentName componetName = new ComponentName(
						"com.main.listviewsideslip",       //包
						"com.main.listviewsideslip.MainActivity");  //类
				try {
					Intent intent = new Intent();
					intent.setComponent(componetName);
					startActivity(intent);
				} catch (Exception e) {
					Toast.makeText(getApplicationContext(),
							getResources().getString(R.string.NoFindApp),
							Toast.LENGTH_SHORT).show();
				}
				break;
			case R.id.button2:  //访问第二个activity页面
//				getRecommendOpen();
				getTestSearch();
				break;
			default:
				break;
			}
		}

		/**
		 * 直接使用Intent.ACTION_WEB_SEARCH搜索关键字查找B应用程序的activity,
		 * 需要在B应用程序AndroidManifest需要打开activity加上
		 * 		  <intent-filter>   
         *        <action android:name="com.test"/>   
         *        <category android:name="android.intent.category.DEFAULT"/>   
         *        </intent-filter>
		 */
		private void getTestSearch() {
			try {
				ComponentName componetName = new ComponentName(
						"com.main.listviewsideslip",
						"com.main.listviewsideslip.ListViewItemShowActivity");
				// 也可以用这个作为搜索关键
			    Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
			    intent.setComponent(componetName);
				Bundle bundle = new Bundle();
				bundle.putInt("HeadImg", 2);
				bundle.putInt("NewNum", 99);
				bundle.putString("Name", "成功");
				intent.putExtras(bundle);
				startActivityForResult(intent, 20);
			} catch (Exception e) {
				Toast.makeText(getApplicationContext(),
						getResources().getString(R.string.NoFindApp),
						Toast.LENGTH_SHORT).show();
			}
		}

		/**
		 * 使用这种方式打开B应用程序activity,不用使用搜索,直接加上名称
		 * 需要在B应用程序AndroidManifest需要打开activity加上
		 *        <intent-filter>   
         *        <action android:name="com.test"/>   
         *        <category android:name="android.intent.category.DEFAULT"/>   
         *        </intent-filter>
		 */
		private void getRecommendOpen() {
			try {
			    Intent intent = new Intent("com.test");
				// 使用bundle携带数据
				Bundle bundle = new Bundle();
				bundle.putInt("HeadImg", 2);
				bundle.putInt("NewNum", 99);
				bundle.putString("Name", "成功");
				intent.putExtras(bundle);
				startActivityForResult(intent, 20);
			} catch (Exception e) {
				Toast.makeText(getApplicationContext(),
						getResources().getString(R.string.NoFindApp),
						Toast.LENGTH_SHORT).show();
			}
		}

		/**
		 * 这个函数时查找系统启动各个应用程序,都能查找出来相应的包
		 * 可以用来查看当前启动应用程序的情况
		 */
		private void getFindRunningAppProcess() {
			ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
			List<ActivityManager.RunningAppProcessInfo> list = activityManager
					.getRunningAppProcesses();
			if (list != null) {
				for (int i = 0; i < list.size(); ++i) {
					if ("com.main.listviewsideslip"
							.matches(list.get(i).processName)) {
					}
				}
			}
		}
	}

	/**
	 * 接受返回activity的数据
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent dataReceive)  {
		if (dataReceive == null) {
			return;
		}
		if (requestCode == 20) {
			Bundle bundle = dataReceive.getExtras();
			String strResultString = bundle.getString("backData");
			TextView showTextView = (TextView)findViewById(R.id.textView1);
			showTextView.append("from ListviewSideslip 应用程序返回的data:" + "\n");
			showTextView.append(strResultString);
		}
    }	

}


如果打开时其他应用程序的主activity,就不用写AndroidManifest。其他activity需要去写一下,写了配置也有两种打开方式。看上面测试代码就知道了。看看配置。



三、随便看看其他activity接受数据,以及返回数据方法。

package com.main.listviewsideslip;

import com.listview.adapter.ImageLoadManage;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

public class ListViewItemShowActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.recent_listview_item);
		
		initView();
	}

	private void initView() {
		ImageLoadManage imageLoadManage = new ImageLoadManage();
		Bundle bundle = this.getIntent().getExtras();
		if (bundle == null) {
			return;
		}

		TextView name = (TextView) findViewById(R.id.recent_list_item_name);
		TextView num = (TextView) findViewById(R.id.unreadmsg);
		ImageView head = (ImageView) findViewById(R.id.icon);
		
		imageLoadManage.getImageView(bundle.getInt("HeadImg"), head);
		name.setText(bundle.getString(("Name")));
		num.setText(String.valueOf(bundle.getInt("NewNum")));
	}
	
	@Override
	public void finish() {
		Intent intent = new Intent();
		Bundle bundle = new Bundle();
		bundle.putString("backData", "来自listviewsideslip应用程序的数据");
		intent.putExtras(bundle);
		setResult(RESULT_OK,intent);
		super.finish();
	}
}


四、补充这篇博客Android 使用开源库加载网络图片一点内容,测试打开activity代码也是从这篇demo中修改得来的。现在补充关于开源库加载网络图片一个封装的调用类。

package com.listview.adapter;

import android.widget.ImageView;

import com.main.listviewsideslip.Constants;
import com.main.listviewsideslip.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
/**
 * 开源库universal-image-loader-1.9.4-with-sources.jar图片加载管理类
 * @author Administrator
 *
 */
public class ImageLoadManage {
	private DisplayImageOptions mOptions; // 设置图片显示相关参数
	public static String[] mImageUrls; // 图片路径
	private ImageLoader mImageLoader;   //网络图片加载类
	
	public ImageLoadManage(){
		mImageLoader = ImageLoader.getInstance();
		initImageView();		
	}
	
	public void initImageView() {
		mImageUrls = Constants.images;

		// 使用DisplayImageOptions.Builder()创建DisplayImageOptions
		mOptions = new DisplayImageOptions.Builder()
				.showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片
				.showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片
				.showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片
				.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
				.cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
				.displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
				.build(); // 构建完成

	}
	
	/**
	 * 外部需要加载图片,直接使用这个函数即可
	 * @param position
	 * @param Image
	 */
	public void getImageView(int position ,ImageView Image){
		/**
		 * imageUrl 图片的Url地址 imageView 承载图片的ImageView控件 options
		 * DisplayImageOptions配置文件
		 */
		mImageLoader.displayImage(mImageUrls[position],
				Image, mOptions);
	}
}
直接使用这个方法getImageView(int position ,ImageView Image)就可以加载图片。这样使用起来就很简洁。

本文demo下载地址:点击

欢迎大家一起交流学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: