`
longgangbai
  • 浏览: 7315801 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android service 生命周期 和 图片的缩放翻转功能

阅读更多

          Android开发中,当需要创建在后台运行的程序的时候,就要使用到Service。Service 可以分为有无限生命和有限生命两种。
 特别需要注意的是Service跟Activities是不同的(简单来说可以理解为后台与前台的区别),例如,如果需要使用Service的话,
 需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。

 Service的开发如下:
    1.创建继承自Service的类,并实现相关的方法。
    2.在androidmanifest.xml中application中添加service配置。
    3.通过intent启动或者关闭 相关的服务
  启动一个Service的过程如下:
  context.startService()  ->onCreate()- >onStart()->Service running
  其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。
  
  
  停止一个Service的过程如下:
  context.stopService() | ->onDestroy() ->Service stop

    各种目录文件的获取资源信息:
 /res/xml:
    XmlResourceParser xml = getResources().getXml(R.xml.data);  

 
 /res/raw
    getResources().openRawResource(R.raw.rawtext)  
 
 
 /assets
        AssetManager assets = getAssets(); 
        assets.open("data.txt"))  

 

服务的生命周期

部分内容参考自CSDN博客:http://blog.csdn.net/wtao158/archive/2010/01/08/5149721.aspx

 

有了 Service 类我们如何启动他呢,有两种方法:

      • Context.startService()
      • Context.bindService()


     1.  在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。

      2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

     

      总结:

      1. startService()的目的是回调onStart()方法,onCreate() 方法是在Service不存在的时候调用的,如果Service存在(例如之前调用了bindService,那么Service的onCreate方法已经调用了)那么startService()将跳过onCreate() 方法。

      2.  bindService()目的是回调onBind()方法,它的作用是在Service和调用者之间建立一个桥梁,并不负责更多的工作(例如一个Service需要连接服务器的操作),一般使用bindService来绑定到一个现有的Service(即通过StartService启动的服务)。

      由于Service 的onStart()方法只有在startService()启动Service的情况下才调用,故使用onStart()的时候要注意这点。

 

与 Service 通信并且让它持续运行

      如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先 startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。

 

提高 Service 优先级

      Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。如果你的 Service 碰上了这种情况,多半会先被杀掉。但如果你增加 Service 的优先级就能让他多留一会,我们可以用 setForeground(true) 来设置 Service 的优先级。

      为什么是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 一般被标记为 foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity 类似优先级得到了一定的提高。当让这并不能保证你得 Service 永远不被杀掉,只是提高了他的优先级。

 

摘自网络其他资料:关于Service生命周

Android Service生命周期与Activity生命周期是相似的,但是也存在一些细节上也存在着重要的不同:

onCreate和onStart是不同的

通过从客户端调用Context.startService(Intent)方法我们可以启动一个服务。如果这个服务还没有运行,Android将启动它并且在onCreate方法之后调用它的onStart方法。如果这个服务已经在运行,那么它的onStart方法将被新的Intent再次调用。所以对于单个运行的Service它的onStart方法被反复调用是完全可能的并且是很正常的。

onResume、onPause以及onStop是不需要的

回调一个服务通常是没有用户界面的,所以我们也就不需要onPause、onResume或者onStop方法了。无论何时一个运行中的Service它总是在后台运行。

onBind

如果一个客户端需要持久的连接到一个服务,那么他可以调用Context.bindService方法。如果这个服务没有运行方法将通过调用onCreate方法去创建这个服务但并不调用onStart方法来启动它。相反,onBind方法将被客户端的Intent调用,并且它返回一个IBind对象以便客户端稍后可以调用这个服务。同一服务被客户端同时启动和绑定是很正常的。

onDestroy

与Activity一样,当一个服务被结束是onDestroy方法将会被调用。当没有客户端启动或绑定到一个服务时Android将终结这个服务。与很多Activity时的情况一样,当内存很低的时候Android也可能会终结一个服务。如果这种情况发生,Android也可能在内存够用的时候尝试启动被终止的服务,所以你的服务必须为重启持久保存信息,并且最好在onStart方法内来做。

 

 

在android中Activity负责前台界面展示,service负责后台的需要长期运行的任务。Activity和Service之间的通信主要由IBinder负责。在需要和Service通信的Activity中实现ServiceConnection接口,并且实现其中的onServiceConnected和onServiceDisconnected方法。然后在这个Activity中还要通过如下代码绑定服务:

Java代码 
  1. Intent intent = new Intent().setClass( this , IHRService.class );  
  2. bindService( intent , this , Context.BIND_AUTO_CREATE );  

 当调用bindService方法后就会回调Activity的onServiceConnected,在这个方法中会向Activity中传递一个IBinder的实例,Acitity需要保存这个实例。代码如下:

Java代码 
  1. public void onServiceConnected( ComponentName inName , IBinder serviceBinder) {  
  2.     if ( inName.getShortClassName().endsWith( "IHRService" ) ) {  
  3.     try {  
  4.         this.serviceBinder= serviceBinder;  
  5.         mService = ( (IHRService.MyBinder) serviceBinder).getService();  
  6.         //mTracker = mService.mConfiguration.mTracker;  
  7.         } catch (Exception e) {}  
  8.               
  9.     }  
  10. }  

 

在Service中需要创建一个实现IBinder的内部类(这个内部类不一定在Service中实现,但必须在Service中创建它)。

Java代码 
  1. public class MyBinder extends Binder {  
  2. //此方法是为了可以在Acitity中获得服务的实例  
  3.     public IHRService getService() {  
  4.         return IHRService.this;  
  5.     }  
  6. //这个方法主要是接收Activity发向服务的消息,data为发送消息时向服务传入的对象,replay是由服务返回的对象  
  7.     public boolean onTransact( int code , Parcel data , Parcel reply , int flags ) {  
  8.         //called when client calls transact on returned Binder  
  9.         return handleTransactions( code , data , reply , flags );  
  10.     }  
  11.   
  12. }  

  

然后在Service中创建这个类的实例:

Java代码 
  1. public IBinder onBind( Intent intent ) {  
  2.     IBinder result = null;  
  3.     if ( null == result ) result = new MyBinder() ;  
  4.     return result;  
  5. }  

 这时候如果Activity向服务发送消息,就可以调用如下代码向服务端发送消息:

Java代码 
  1. inSend = Parcel.obtain();  
  2. serviceBinder.transact( inCode , inSend , null , IBinder.FLAG_ONEWAY );  

 

这种方式是只向服务端发送消息,没有返回值的。如果需要从服务端返回某些值则可用如下代码:

Java代码 
  1. result = Parcel.obtain();  
  2. serviceBinder.transact( inCode , inSend , result , 0 );  
  3. return result;  

发送消息后IBinder接口中的onTransact将会被调用。在服务中如果有结果返回(比如下载数据)则将结果写入到result参数中。在Activity中从result中读取服务执行的结果。

 

上面只是描述了如何由Acitity向Service发送消息,如果Service向Activity发送消息则可借助于BroadcastReceiver实现,BroadcastReceiver比较简单,前面在将Service中已有提及。

 

android service使用实例:

 

package com.etrip.srvs;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
 * 	

	
实例:	
	接下来的实例是一个利用后台服务播放音乐的小例子,点击start运行服务,点击stop停止服务。
 * 
 * 
 * @author longgangbai
 */
public class AndroidServicesActivity extends Activity implements OnClickListener {
	  private static final String TAG = "ServicesDemo";
	  Button buttonStart, buttonStop;

	  @Override
	  public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.main);

	    buttonStart = (Button) findViewById(R.id.buttonStart);
	    buttonStop = (Button) findViewById(R.id.buttonStop);

	    buttonStart.setOnClickListener(this);
	    buttonStop.setOnClickListener(this);
	  }

	  public void onClick(View src) {
	    switch (src.getId()) {
	    case R.id.buttonStart:
	      Log.d(TAG, "onClick: starting srvice");
	      startService(new Intent(this, MyService.class));
	      break;
	    case R.id.buttonStop:
	      Log.d(TAG, "onClick: stopping srvice");
	      stopService(new Intent(this, MyService.class));
	      break;
	    }
	  }
	}

 

 service的实现:

package com.etrip.srvs;


import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
/**
 * 
 * Service的学习
 * 
 *  
 * @author longgangbai
 */
public class MyService extends Service {
	private static final String TAG = "MyService";
	MediaPlayer player;
	
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	
	
	@Override
	public void onCreate() {
		Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
		Log.d(TAG, "onCreate");
		
		player = MediaPlayer.create(this, R.raw.baby);//运行例子是,需要替换音乐的名称
		player.setLooping(false); // Set looping
	}

	@Override
	public void onDestroy() {
		Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
		Log.d(TAG, "onDestroy");
		player.stop();
	}
	
	@Override
	public void onStart(Intent intent, int startid) {
		Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
		Log.d(TAG, "onStart");
		player.start();
	}
}

 

 

图片翻转:

package com.easyway.andorid.hello;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout.LayoutParams;

/**
 * Android实现图片的缩放功能
 * @author longgangbai
 * @date 2010-5-24
 * @version 1.0
 * @since JDK6.0
 */
public class ImageViewAndorid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         //设置程序的标题
         setTitle("缩放和旋转图片");
         //实例化LinearLayout类的对象lly
         LinearLayout lly=new LinearLayout(this);
         //获取图片的信息 这里用的是icon.png ,图片存放的位置在res/drawable下,
         //同时这里还方有itfunz.bmp,这就是应用程序的图标
         Bitmap bmpOrg=BitmapFactory.decodeResource(getResources(), R.drawable.icon);
         //获取图片的原始的大小
         int width=bmpOrg.getWidth();
         int height=bmpOrg.getHeight();
         
         int newWidth=400;
         int newheight=400;
         //定义缩放的高和宽的尺寸
         float sw=((float)newWidth)/width;
         float sh=((float)newheight)/height;
         //创建操作图片的用的Matrix对象
         Matrix matrix=new Matrix();
        
         matrix.postScale(sw,sh);
         //缩放图片的动作
         matrix.postRotate(30);
         //旋转30*
         Bitmap resizeBitmap=Bitmap.createBitmap(bmpOrg,0,0,width,height,matrix,true);
        
         //创建一个新的图片 
         BitmapDrawable bmp=new BitmapDrawable(resizeBitmap);
        
         //创建Bitmap转换为Drawable对象,使其可以使用在ImageView和ImageButton中
         ImageView imageView=new ImageView(this);
         //创建ImageView的对象
         imageView.setImageDrawable(bmp);
         //将图片设置到中间
         imageView.setScaleType(ScaleType.CENTER);
         //将图片填充之整个视图
         lly.addView(imageView, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
         //添加ImageView到布局模板中
         setContentView(lly);
    }
}
分享到:
评论

相关推荐

    android 图片拼接 缩放 特效 拖动 翻转

    本文将深入探讨如何在Android平台上实现图片的拼接、缩放、特效、拖动以及翻转功能,这些都是移动应用中常见的交互和视觉元素。我们将以`DrawDemo`为例,来阐述这些技术的实现细节。 1. **图片拼接**: 图片拼接是...

    Android-一个Android图片缩放查看控件支持手势

    在Android应用开发中,图像处理和展示是必不可少的一部分,尤其是对于需要用户交互的图片查看功能。这个名为"Android-一个Android图片缩放查看控件支持手势"的项目,旨在提供一个自定义的视图控件,它允许用户通过...

    vue iview多张图片大图预览、缩放翻转

    标签为“vue iview多张图片大图预览 vue iview多张图片预览 vue图片预览缩放翻转”,这些标签指向了本文的核心内容,即如何在Vue和iView的环境下实现图片预览功能,以及如何实现图片的缩放和翻转。这些标签将帮助...

    Android SurfaceView 实现图片缩放 滑动

    本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解SurfaceView的核心特性是关键。SurfaceView拥有自己的独立渲染线程,这使得它能够高效地处理图像数据,避免阻塞UI主线程。在实现图片缩放...

    Android实现图片缩放功能

    本篇将详细介绍如何在Android中实现图片的缩放功能,特别是利用ImageView结合手势识别来实现这一效果。 首先,我们需要了解Android中的Bitmap对象,它是Android系统用来表示图像数据的核心类。Bitmap可以存储像素...

    android imageview 图片缩放

    本文将深入探讨如何在Android中实现ImageView的图片缩放功能,同时结合异步加载和Activity的半透明效果,提升用户体验。 首先,我们要理解Android中ImageView的基本用法。ImageView可以设置为固定大小或根据图片...

    Android studio 实现图片翻转

    总之,实现“Android studio 实现图片翻转”这一功能,需要掌握Android动画系统的基础知识,理解视图动画、属性动画的原理,熟悉自定义View的绘制过程,以及如何处理用户交互。通过这些技术,可以创建出类似支付宝...

    android手势处理图片平移、缩放和旋转

    "android手势处理图片平移、缩放和旋转"这个主题涉及到的主要知识点包括Android手势检测、ImageView的扩展以及图片操作。 首先,我们要了解Android的手势检测。Android系统提供了一套GestureDetector和...

    Android代码-Android图片浏览全屏缩放.zip

    【Android图片浏览全屏缩放】是一个Android应用开发中的常见需求,主要涉及到图像处理和UI交互方面的技术。在Android平台上,我们通常会使用ImageView组件来显示图片,但是要实现图片的全屏展示以及平滑缩放,需要更...

    android 实现图片的拖拉缩放功能

    在Android开发中,图片的拖拉缩放功能是常见的用户交互设计,特别是在各种应用和游戏中。这个小例子展示了如何在Android环境中实现这一功能。本文将详细介绍实现这一功能的关键技术和步骤。 首先,我们要创建一个...

    Android 图片浏览全屏缩放

    在Android开发中,实现图片浏览的全屏缩放效果是一项常见的需求,特别是在社交应用中,如QQ好友动态和微信朋友圈。这种功能不仅需要提供良好的用户体验,还需要考虑性能和内存优化,因为图片通常较大,处理不当可能...

    Android图片缩放全功能

    综上所述,"Android图片缩放全功能"涵盖了从基础的图片缩放技术到高级的图片处理库和优化策略。开发者需要理解各种缩放方法、资源管理和优化技巧,才能在Android应用中实现高效的图片显示和流畅的用户体验。

    android 2.0版本以下的图片缩放以及滑动

    这个项目可能包含了实现上述功能的代码示例,通过研究其源码,可以更直观地了解如何在Android 2.0以下版本实现图片滑动和按键缩放。需要注意的是,虽然早期版本的Android系统限制了多点触控,但通过巧妙的设计和编程...

    图片查卡器JS,支持图片缩放翻转漫游

    标题中的“图片查卡器JS,支持图片缩放翻转漫游”指的是一个基于JavaScript的图片查看器,它具备图片缩放、翻转和漫游(平移)等功能,为用户提供更加灵活和丰富的图片浏览体验。这样的工具在网页设计、在线相册、...

    android图片预览缩放

    `ScaleView`通常是指一个自定义视图,用于实现图片的平滑缩放和平移功能。本文将深入探讨Android图片预览缩放的相关知识点,并结合`ScaleView`的实现原理进行详细解析。 ### 1. 图片加载库 在Android中,高效的...

    android 图片手势缩放

    在Android开发中,图片手势缩放是用户交互中常见的功能,尤其在查看照片、地图或者任何需要用户放大或...这个例子应该包含了实现这一功能的完整代码和示例,对于理解如何在Android应用中集成图片手势缩放非常有帮助。

    Android图片缩放动画Demo

    在Android开发中,图片的缩放与动画效果是常见的需求,尤其在社交应用如QQ、微信和新浪微博中,用户在浏览图片时会遇到从缩略图平滑过渡到原图的功能。这个"Android图片缩放动画Demo"正是为了实现这样的功能而设计的...

    Android Matrix处理ImageView中图片缩放,平移

    总的来说,Android中的Matrix类提供了丰富的图像变换功能,结合ImageView和Bitmap,我们可以实现各种复杂的图像操作,如缩放和平移。理解并熟练运用Matrix,可以极大地提升Android应用中图像处理的灵活性和用户体验...

    Android图片裁剪----移动、缩放图片进行裁剪

    通过查看和学习这个项目的代码,开发者可以更好地理解如何在Android中实现图片的移动、缩放和裁剪功能。 总之,Android图片裁剪涉及多个方面,包括图像处理、手势识别和UI交互。通过掌握这些技术,开发者能够创建...

    Android图片编辑demo(裁剪、旋转、缩放)

    这个"Android图片编辑demo"提供了一个基础的实现,涵盖了图片的裁剪、旋转和缩放等操作。下面我们将深入探讨这些知识点。 首先,**图片裁剪**是用户对图片进行个性化调整的常用功能。在Android中,可以通过`android...

Global site tag (gtag.js) - Google Analytics