android service和activity的通讯

android service和activity的通讯

大家好,又见面了,我是全栈君。

我们须要用下面方式来启动service:

</pre><pre name="code" class="java"><span style="white-space:pre">		</span>Intent intent = new Intent();
		intent.setClass(MainActivity.this, MyService.class);
		<strong>bindService(intent,conn,BIND_AUTO_CREATE);</strong>

	ServiceConnection conn = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mService = ((MyService.MyBinder)service).getService();  
		}
	};
	

这时service会运行:onCreate和onBind

然后

我们去运行一些任务:

	ImageView item_image = (ImageView)findViewById(R.id.item_image);
		item_image.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				<strong>mService.setHandler(mHandler);
			   mService.startCheckIfUpgrade();</strong>
			}
		});


	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case GET_UPGRADE_INFORMATION_COMPLETE:
				System.out.println("=======notify need upgrade");
				AlertDialog dialog = getCustomDialog();
				dialog.show();
			default:
				break;
			}
		}
	};

Service的代码是:

public class MyService extends Service {

	/** thread to execute background task*/
	private Thread mThread = null;
	
	/** flag indicates if the service has been stopped*/
	private boolean mStopFlag = false;
	
	private static final int GET_UPGRADE_INFORMATION_COMPLETE = 202;
	
	/** Handler to get notify from thread*/
	private Handler mHandler = null;
	
	public void setHandler(Handler handler) {
		this.mHandler = handler;
	}
	
	
	@Override
	public boolean onUnbind(Intent intent) {
		System.out.println("====service onUnbind");
		return super.onUnbind(intent);
	}

	public class MyBinder extends Binder {
		/**
		 * 获取当前Service的实例
		 * 
		 * @return
		 */
		public MyService getService() {
			return MyService.this;
		}
	}
	
	public void startCheckIfUpgrade() {
		if(mThread == null){
			mThread = new UpgradeThread();
			mThread.start();
		}
	}
	   
	@Override
	public IBinder onBind(Intent arg0) {
		System.out.println("====service onBind");
		
		return new MyBinder();
	}
	
	/**
	 * @see android.app.Service#onCreate()
	 */
	@Override
	public void onCreate() {
		super.onCreate();
		System.out.println("====service onCreate");
	}

	private class UpgradeThread extends Thread{

		/**
		 * @see java.lang.Thread#run()
		 */
		@Override
		public void run() {
			super.run();
			//在这里写去服务端查看是否须要升级的逻辑
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			boolean ret = true;
			if(ret && !mStopFlag){
				Message msg = new Message();
				msg.what = GET_UPGRADE_INFORMATION_COMPLETE;
				mHandler.sendMessage(msg);
			}
		}
		
	}
	
	/* (non-Javadoc)
	 * @see android.app.Service#onDestroy()
	 */
	@Override
	public void onDestroy() {
		System.out.println("====ondestroy");
		mStopFlag = true;
		try {
			if (null != mThread && mThread.isAlive()) {
				try
				{
					mThread.stop();
				}
				catch (Exception e)
				{
				}
			}
			mThread = null;
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		super.onDestroy();
		System.gc();
	}

}

当activity销毁后Service会运行:

onUnbind和onDestroy

这个说明这个service的生命周期和activity是一致的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116014.html原文链接:https://javaforall.net

(4)
上一篇 2022年1月27日 上午11:00
下一篇 2022年1月27日 上午11:00


相关推荐

  • 三道计算时间复杂度的题目

    三道计算时间复杂度的题目出处 算法第四版 EditionSedge 著 问题 1 4 7 三道小题初看觉得很简单 但是仔细一分析 a b 小题里面的内循环操作次数是和外层的 n i 值有关 并不是简单的操作 N 次 很久没有算过时间复杂度了 稍微感到有点棘手 publicstatic intN intsum 0 for intn N n gt 0 n 2 for inti 0 i lt

    2026年3月16日
    2
  • java笔试题_一道简单的 Java 笔试题,但值得很多人反思

    java笔试题_一道简单的 Java 笔试题,但值得很多人反思专注于Java领域优质技术,欢迎关注作者:匿蟒前言面试别人,对我来说是一件新奇事,以前都是别人面试我。我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才。所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的、基础的。我只要最终给Leader一句“这个人技术还行/很好/非常好”,就行了。至于其它能力、综合水平,由别人把关。为此,在挑选唯一的一道笔试题时,我特别地上心。首先,我不…

    2022年7月7日
    27
  • Mcafee 杀毒软件自动扫描U盘病毒完美解决方案与思路

    Mcafee 杀毒软件自动扫描U盘病毒完美解决方案与思路

    2021年8月28日
    96
  • 腾讯2024年营收6603亿增8%,马化腾回应机器人布局

    腾讯2024年营收6603亿增8%,马化腾回应机器人布局

    2026年3月13日
    3
  • svn基本命令使用

    svn基本命令使用

    2021年10月29日
    41
  • srgb的伽马值_srgb模式和标准模式

    srgb的伽马值_srgb模式和标准模式sRGB标准人眼对亮度的感知不是线性的,其对较暗区域的变化更加敏感参见:ComputerColorisBroken基于人眼该特点,sRGB标准要求图像(各通道为8bits,最多存储256个亮度值)使用编码伽马,把更多地空间用来存储更多暗部区域,来最大化地利用表示亮度的数据位或带宽伽马校正(Gammacorrection)在早期,阴极射线管(CRT)显示器是唯一的电子显示设备,但它的输入电压和显示出来的亮度关系不是线性的,而是一个类似幂律(pow-law)曲线的关系,…

    2025年11月30日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号