精华内容
下载资源
问答
  • Android后台服务Service

    万次阅读 2018-03-27 00:16:57
    后台服务桌面应用程序:可见服务:不可见 长期在后台运行 帮助应用执行耗时的操作 安卓的服务:安卓四大组件之一 不可见 后台长期运行 界面与服务有时候要执行数据交互如何创建服务:1. 创建一个类 继承Service....

    后台服务

    桌面应用程序:可见

    服务:不可见  长期在后台运行 帮助应用执行耗时的操作

    安卓的服务:安卓四大组件之一  不可见   后台长期运行 界面与服务有时候要执行数据交互

    如何创建服务:

    1. 创建一个类 继承Service.


    package com.li.servce;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.util.Log;
    
    public class MyService extends Service{
    	//Service启动时调用
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		Log.v("wang", "OnCreate 服务启动时调用");
    		
    	}
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    	//服务被关闭时调用
    	@Override
    	public void onDestroy() {
    		super.onDestroy();
    		Log.v("wang", "onDestroy 服务关闭时");
    	}
    
    }

    四大组件多需要配置配置


     <service android:name="com.li.servce.MyService"></service> <!--绑定一个服务类-->

    调用服务器

    package com.li.servce;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    	}
    	public void createServiceClick(View v){
    		Intent intent = new Intent(this,MyService.class);
    		//启动servicce服务
    		startService(intent);
    	}
    	//虽然应用界面已经退出  但是服务还是存在的
    	//停止服务  可以通过按钮来关闭   可以通过代码关闭服务
    	public void clickStopService(View v){
    		Intent name= new Intent(this,MyService.class);
    		stopService(name);//name表示停止哪一个服务
    	}
    	
    }
    

    电话窃听器原理

    开发步骤:

    1. 创建一个后台运行的服务

    2. 启动应用的时候启动服务

    3. onCreate()调用的时候 创建一个系统的服务 并获取电话的状态

    TelephonyManagermanager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

    //1. 注册监听器  2. 监听的事件

    代码:

    package com.li.callMyVoce;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    
    public class CallService extends Service{
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		//开始时刻接听用户电话状态   休闲(没有接听电话)   邻响    接通    挂断
    		//如果自己去写代码接通用户状态  会很复杂 的操作  求系统
    		//系统服务getSystemService(name)   电话有关的服务      服务的后缀一般以service manager ...作为后缀
    		//TelephonyManager  他表示可以接听各种各样跟手机有关的很多服务  他表是一个大的概念
    		TelephonyManager manager=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
    										 												//manager.listen(listener, events)
    		manager.listen(new PhoneStateListener(){										//listener表是接听手机的那个状态比如说接听电话的服务new PhoneStateListenter()//重写方法等等
    			@Override
    			public void onCallStateChanged(int state, String incomingNumber) {//incomingNumber表示电话号码   只有来点时才有值
    				switch (state) {
    				case TelephonyManager.CALL_STATE_IDLE:
    					Log.v("wang", "CALL_STATE_IDLE   休闲状态     挂断");
    					break;
    				case TelephonyManager.CALL_STATE_OFFHOOK:
    					Log.v("wang", "CALL_STATE_OFFHOOK  接通");
    					break;
    				case TelephonyManager.CALL_STATE_RINGING:
    					Log.v("wang", "CALL_STATE_RINGING    电话铃声响状态"+incomingNumber);
    					break;
    				}
    			}
    		}, PhoneStateListener.LISTEN_CALL_STATE);									
    																						// events  就是要指定对那些事件比较关心
    	}
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    }
    

    调用:

    package com.li.callMyVoce;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    	//1.时时刻刻的接听用户当前的打电话状态  ----> Service
    	//2.当用户开启接听电话的时候  开始录音   用户挂断了电话停止录音--->录音功能
    	//3.当发现网络状态(广播  判断是否有网络)是开着的时候就应该发送录音到后台服务器
    	}
    	public void clickService(View v){
    		Intent intent = new Intent(this,CallService.class);
    		startService(intent);
    	}
    }
    

    配置文件里面的铭感操作

         <!-- 绑定服务器 -->
            <service android:name="com.li.callMyVoce.CallService"></service>
     <!-- 电话的铭感操作 -->
    	<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    服务和子线程的区别

    总结:

    * 服务是长期在后台运行的

    * 开启一个用真的死循环的子线程也是在后台长期运行

    *如果一个应用程序有后台的服务在运行,即使你杀掉进程,进程和服务还会自动的复活

    * 如果一个应用程序只有后台的子线程运行 杀掉进程进程和子线程都挂了

    * 如果你要保证一个后台的操作长期运行1.开启服务 2.在服务里面创建线程


    展开全文
  • android 后台服务启动方式: 第一种:

    android 后台服务启动方式:

    第一种:Activity界面通过Intent启动相关service.====等价于(Timer定时器+TimerTask定时任务)

    第二种:Activity界面通过发生广播启动相关service=====等价于(AlarmManager闹钟服务)

     

    相关示列代码:待补全

     

    android 后台服务如何长时间运行解决办法:

    解决后台服务长时间运行第一种和第二种方案,这里就不贴出相关的配置文件信息,我们将重点讲解第三种和第四种解决方案。

     

    第三种:解决方案

    重写Service的onStartCommand方法,使用StartForeground(int,Notification)方法来启动service。

    注:前台服务会在状态栏显示一个通知,最典型的应用就是音乐播放器,只要在播放状态下,就算休眠也不会被杀,如果不想显示通知,只要把参数里的int设为0即可。

    Java核心代码:

    Notification notification = new Notification(R.drawable.logo,"wf update service is running",                 System.currentTimeMillis()); 
    pintent=PendingIntent.getService(this, 0, intent, 0);  
    notification.setLatestEventInfo(this, "WF Update Service","wf update service is running!", pintent); 
    //让该service前台运行,避免手机休眠时系统自动杀掉该服务  
    //如果 id 为 0 ,那么状态栏的 notification 将不会显示。  
    startForeground(startId, notification); 
    

    同时,对于通过startForeground启动的service,onDestory方法中需要通过stopForeground(true)来取消前台运行状态。

    ps:如果service被杀后下次重启出错,可能是此时重发的Intent为null的缘故,可以通过修改onStartCommand方法的返回值来解决:

    START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

    START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

    START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

    START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

     

    第四种:解决方案

    1、Intent.ACTION_TIME_TICK的使用
    我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。即你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过registerReceiver()方法注册。

    在ThisApp extends Application 或者在service里注册广播:

    IntentFilter filter = newIntentFilter(Intent.ACTION_TIME_TICK); 
        
        MyBroadcastReceiver receiver = new MyBroadcastReceiver(); 
        registerReceiver(receiver, filter); 


    在广播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里

     boolean isServiceRunning = false; 
    
    
        if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) { 
          
        //检查Service状态 
          
        ActivityManager manager = (ActivityManager)ThisApp.getContext().getSystemService(Context.ACTIVITY_SERVICE); 
        for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) { 
        if("so.xxxx.xxxxService".equals(service.service.getClassName())) 
              
         { 
         isServiceRunning = true; 
        } 
          
         } 
        if (!isServiceRunning) { 
        Intent i = new Intent(context, xxxService.class); 
               context.startService(i); 
        } 
    
    
    } 




     

    展开全文
  • 后台服务中有个长连接,在程序在后台运行时,长连接connect lost(服务没有挂掉), 导致频繁重连。但是连接usb的时候,长连接就不会被断开。请问这个问题 是什么个情况,在线等,急!
  • Android后台服务在屏幕休眠保持运行

    千次阅读 2020-05-05 20:27:31
    Android App中的Service可以保持后台运行,比如音乐播放就是Service的典型应用,在开发移动APP时,很多业务场景需要用到Service保持在后台运行,在实现过程中让Service在屏幕休眠下继续保持运行,往往没有按照预期...

    Android App中的Service可以保持后台运行,比如音乐播放就是Service的典型应用,在开发移动APP时,很多业务场景需要用到Service保持在后台运行,在实现过程中让Service在屏幕休眠下继续保持运行,往往没有按照预期运行,下面例程中实现后台服务定时上报GPS数据,尝试多种方式勉强实现。

    1、将服务设置为前台服务,在屏幕左上角显示一个图标

    在这里插入图片描述
    在Service的onStartCommand方法里面,将服务放置前台
    在这里插入图片描述
    在onDestroy方法里面
    在这里插入图片描述

    2、只将Service放置到前台前提下,继续设置电源控制

    在onCreate方法里面,添加电源控制
    在这里插入图片描述

    在onDestroy方法里面
    在这里插入图片描述

    3、在设置1、2前题下,继续实现后台播放无声音乐

    在onStartCommand添加音乐播放音乐
    在这里插入图片描述
    在onDestroy方法里面
    在这里插入图片描述

    4、设置前台服务可以在APP退出后可以释放资源

    在onStartCommand返回START_NOT_STICKY,否则前台服务无法退出
    在这里插入图片描述

    5、使用高德地图API定时采集GPS数据

    @Override
    public void onCreate() {
        super.onCreate();
    
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TimerLocationService.class.getName());
        wakeLock.acquire();
    
        locationClient = new AMapLocationClient(this.getApplicationContext());
        locationClient.setLocationOption(getDefaultOption());
        locationClient.setLocationListener(locationListener);
        // 启动定位
        locationClient.startLocation();
    
        IntentFilter filter= new IntentFilter();
        filter.addAction(Intent.ACTION_TIME_TICK);
        registerReceiver(receiver,filter);
    
        Util.service = this;
    }
    

    完全实现1-5中的代码,可以保证服务在屏幕休眠后保持运行,后台播放无声音乐缺点是比较耗电。

    package com.hk.ecology.service;
    
    import android.app.Notification;
    import android.app.PendingIntent;
    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.graphics.BitmapFactory;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.PowerManager;
    import android.util.Log;
    
    import com.amap.api.location.AMapLocation;
    import com.amap.api.location.AMapLocationClient;
    import com.amap.api.location.AMapLocationClientOption;
    import com.amap.api.location.AMapLocationListener;
    import com.hk.ecology.activity.LoadingActivity;
    import com.hk.ecology.logic.HttpCallBack;
    import com.hk.ecology.logic.HttpRequest;
    import com.hk.ecology.logic.RequestCodeSet;
    import com.hk.ecology.model.BaseModel;
    import com.hk.ecology.model.WxOrderInfo;
    import com.hk.ecology.receiver.CheckReceiver;
    import com.hk.ecology.R;
    import com.hk.ecology.util.SPUtil;
    import com.hk.ecology.util.Util;
    
    import java.util.List;
    import java.util.Timer;
    import java.util.TimerTask;
    
    
    public class TimerLocationService extends Service implements HttpCallBack, RequestCodeSet, MediaPlayer.OnCompletionListener {
        private AMapLocationClientOption locationOption = new AMapLocationClientOption();
        private AMapLocationClient locationClient = null;
        public static TimerLocationService instance = null;
        private final BroadcastReceiver receiver = new CheckReceiver();
        private MediaPlayer mMediaPlayer;
        private PowerManager pm;
        private PowerManager.WakeLock wakeLock = null;
    
        public TimerLocationService() {
            TimerLocationService.instance = this;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TimerLocationService.class.getName());
            wakeLock.acquire();
    
            locationClient = new AMapLocationClient(this.getApplicationContext());
            locationClient.setLocationOption(getDefaultOption());
            locationClient.setLocationListener(locationListener);
            // 启动定位
            locationClient.startLocation();
    
            IntentFilter filter= new IntentFilter();
            filter.addAction(Intent.ACTION_TIME_TICK);
            registerReceiver(receiver,filter);
    
            Util.service = this;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            //id = intent.getStringExtra("id");
            Notification.Builder builder = new Notification.Builder(this.getApplicationContext());
            Intent nfIntent = new Intent(this, LoadingActivity.class);
            builder.setContentIntent(PendingIntent.getActivity(this, 0, nfIntent, 0))
                    .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_default_head))
                    .setContentTitle("古方红糖-绿色农产品")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentText("发货跟踪")
                    .setWhen(System.currentTimeMillis());
            Notification notification = builder.build();
            startForeground(startId, notification);
    
            mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.no_notice);
            mMediaPlayer.setLooping(true);
            if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
                mMediaPlayer.setOnCompletionListener(this);
                mMediaPlayer.start();
            }
    
            //flags = START_STICKY;
            //return super.onStartCommand(intent, flags, startId);
            return START_NOT_STICKY;
        }
    
        public void requestServer(double longitude,double latitude) {
            String loginId = Util.fmtStr(SPUtil.getString("loginId"));
            String password = Util.fmtStr(SPUtil.getString("password"));
            Log.e("requestServer######################################","loginId="+loginId+",password="+password);
            if(!Util.isNull(loginId)) {
                HttpRequest.getInstance().track(this, this, String.valueOf(longitude), String.valueOf(latitude), "1");
            }
        }
    
        @Override
        public void onCompletion(MediaPlayer mp) {
            Log.e("######################################","onCompletion");
            //Location myLoc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            //HttpRequest.getInstance().track(this, this,id,String.valueOf(myLoc.getLongitude()),String.valueOf(myLoc.getLatitude()),"1");
        }
    
        @SuppressWarnings("deprecation")
        @Override
        public void onDestroy() {
            exitService();
            super.onDestroy();
        }
    
        public void exitService()
        {
            stopForeground(true);
            if (mMediaPlayer != null) {
                mMediaPlayer.stop();
            }
            if (wakeLock != null) {
                wakeLock.release();
                wakeLock = null;
            }
            this.stopSelf();
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onSuccess(BaseModel result) {
            if(result != null)
            {
                List<WxOrderInfo> orderList = (List<WxOrderInfo>)result.getResult();
                Log.e("orderList--------------------------------------",orderList.toString());
                String orderId = "";
                for(WxOrderInfo ord:orderList)
                {
                    orderId = orderId + ord.getId() + ",";
                }
                if(orderId.endsWith(","))
                    orderId = orderId.substring(0,orderId.length()-1);
                SPUtil.saveString("orderId",orderId);
            }
        }
    
        @Override
        public void onFailure(BaseModel result) {
    
        }
    
        @Override
        public void onFinish(BaseModel result) {
    
        }
    
        private AMapLocationClientOption getDefaultOption(){
            AMapLocationClientOption mOption = new AMapLocationClientOption();
            mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            mOption.setGpsFirst(true);//设置GPS定位优先
            mOption.setHttpTimeOut(30000);//设置网络请求超时时间
            mOption.setInterval(10000);//设置定位间隔。默认为2秒
            mOption.setNeedAddress(true);//设置是否返回逆地理地址信息。默认是true
            mOption.setOnceLocation(false);//设置是否单次定位。默认是false
            AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
            mOption.setLocationCacheEnable(false); //设置是否使用缓存定位,默认为true
            return mOption;
        }
    
        AMapLocationListener locationListener = new AMapLocationListener() {
            @Override
            public void onLocationChanged(AMapLocation loc) {
                Log.e("locationListener--------------------------------------",loc.toString());
                if (null != loc) {
                    if(loc.getLongitude()!=0.0 && loc.getLatitude() != 0.0){
                        requestServer(loc.getLongitude(),loc.getLatitude());
                    }
                }
            }
        };
    }
    
    
    展开全文
  • 如何检查Android后台服务线程(Service类)是否正在运行 描述: 如何检查后台服务(Android的Service类)是否正在运行?我希望我的Activity能够显示Service的状态,然后我可以打开或者关闭它。   回答: ...

    如何检查Android后台服务线程(Service类)是否正在运行

    描述:

    如何检查后台服务(Android的Service类)是否正在运行?我希望我的Activity能够显示Service的状态,然后我可以打开或者关闭它。

     

    回答:

    Android系统提供了一个函数ActivityManager.getRunningServices可以列出当前正在运行的后台服务线程

    private boolean isServiceRunning() {
        ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if ("com.example.MyService".equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

    这个方法是可靠的,因为这是由Android系统提供的服务查询办法。
    所以以来于OnDestroy或者OnXXX方法,甚或是Binders以及静态变量的方法都是不可靠的,因为作为一个开发者,你永远不知道Android系统什么时候会杀掉你的进程来释放内存,那些回调函数很可能根本没机会被调用。

    另外,关于如果希望手工检查所有后台服务的运行状态,见如何观察和控制正在运行的Android后台服务.


    展开全文
  • Android后台服务拍照的解决方案

    万次阅读 热门讨论 2015-07-23 18:28:56
    最近在项目中遇到一个需求,实现一个后台拍照的功能。一开始在网上寻找解决方案,也尝试了很多种实现方式,都没有满意的方案。不过确定了难点:即拍照要先预览,然后再调用拍照方法。问题也随之而来,既然是要实现...
  • 从头开始编写一个android后台服务器

    千次阅读 2016-12-27 16:44:59
    今天开始写一个android 简易后端服务器,还没想好些什么,先填在这
  • 如何检查后台服务Android的Service类)是否正在运行?我希望我的Activity能够显示Service的状态,然后我可以打开或者关闭它。   回答: Android系统提供了一个函数ActivityManager.getRunningServices...
  • 首先我们要弄清楚service到底是什么东西,它是android用于提供后台服务的,主要service(IntentService)不是进程,也不是线程,是依赖于应用程序的主线程的。Android的后台就是指,它的运行是完全不依赖UI的。即使...
  • 0.启动1x1大小服务窗口进行监听变化,音量按键下按 不接受触摸屏事件。 public static final int FLAG_NOT_TOUCHABLE = 0x00000010; 当窗口可以获得焦点(没有设置FLAG_NOT_FOCUSALBE选项)时,仍然将窗口范围...
  • 前面介绍了service的一般使用,在文章最后提到一般要在service里面启动线程去执行具体操作,这种情况下我们要调用stop...android为我们提供了一个IntentService,来替我们默认创建一个子线程,同时在线程执行完毕以
  • Android——后台服务

    千次阅读 2019-05-19 11:42:16
    实验名称:Android 后台服务 实验目的:通过Service设计后台服务程序,通过Broadcast实现信息广播机制 实验内容: 设计一个简单的后台音乐服务程序; 设计一个简单的信息广播程序示例; 利用Broadcast实现后台服务...
  • 1.Android后台程序是不是应该把整个工程放在服务器上。 2.如果放在服务器上(是不是随便放在服务器上的某个盘下都行),Android应该怎么访问(重点是URL地址怎么写) 3.后台如果要修改东西,是不是修改完了,还得...
  • Android后台开启服务默默拍照

    千次下载 热门讨论 2013-07-07 11:23:17
    Android后台开启服务默默拍照http://blog.csdn.net/yangzl2008/article/details/9262505
  • Android中服务分为前台服务和后台服务。 前台服务需要通知用户一个Notification,表示用户正式使用该服务; 后台服务运行在后台,不需要通知用户启动了该服务。 然后后台服务在空闲状态被终止,打印如下: system_...
  • Android Service 后台服务之本地服务

    千次阅读 2016-05-07 15:53:58
    Service是Android系统的服务组件,适用于开发没有用户界面且长时间在后台运行的功能 ...因此,Android系统需要一种后台服务机制,允许在没有用户界面的情况下,使程序能够长时间在后台运行,实现应用程序的后台服务
  • Android 后台 接口 json 数据 Java JavaEE Android后台通信 servlet doget dopost
  • 快速搭建Android应用后台服务器

    万次阅读 多人点赞 2018-05-08 11:31:42
    一直没单独一个人搭建过后台,之前都是用的云服务后台,跟着帖子一步一步走,最终完美实现后台与移动端的数据沟通,顿时感觉棒棒哒,特此记录一下。很感谢下面帖子的博主得无私分享! 一.后台的搭建 1.自己动手...
  • Android后台云端服务Bmob导入大坑

    千次阅读 2016-05-28 22:01:05
    Android后台云服务Bmob导入大坑
  • Android O后台服务限制总结

    千次阅读 2018-08-16 16:13:21
    我们看Android O的新特性的时候会看到这样一个介绍: ... 如果还有应用或服务后台运行,这会对系统造成更大负担,进而可能导致用户体验下降;例如,音乐应用可能会突然关闭。 为了降低发生这些问题的几率,Androi...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 198,666
精华内容 79,466
关键字:

android后台服务