【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行

前言:

近期在写一个小程序,需求是手机摇一摇就弹窗出来。第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行。

满足了自己的需求。现记录学习心得。

希望能给你带来一些帮助。

1.Service创建:重写4个方法

  • onBind():返回一个IBinder对象,这个对象能够使应用程序与Service通信。假设用startService、stopService启动和关闭Service的话。Service和訪问者是无法通信交换数据的。onBind()返回值设为null就可以。

    可是假设想要交换数据,就要用bindService、unbindService来启动和关闭Service。这时,onBind()要返回一个有效的IBinder对象。

  • onCreate():Service第一次被创建时调用此方法。
  • onStartCommand():理解为onStart()的新一代。每次通过startService(Intent)启动Service时都会调用此方法。
  • onDestroy():Service被关闭之前调用此方法。
package com.service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class PopupService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
    }  

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("Service is Created");
    }  

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    	 System.out.println("Service is Started");

         return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service is Destroyed");

    } 

}

2.Service配置:在AndroidManifest.xml中声明

<service
     android:name="com.service.PopupService"
     android:priority = "1000"    <!-- 提高优先级-->
     android:persistent="true">  <!-- 免杀,不知道有没有起作用-->
     <intent-filter>
          <action android:name="com.service.POPUP_SERVICE" />
     </intent-filter>
</service>

3.Service开机启动:使用BroadcastReceiver

文件创建:

package com.service;  

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;  

    public class StartupReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            //  启动一个Service
            Intent serviceIntent = new Intent(context, PopupService.class);
            context.startService(serviceIntent);
        }
    } 

文件配置:在AndroidManifest.xml中声明

 <receiver android:name="com.service.StartupReceiver">
      <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
 </receiver> 

注意权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

4.Service从Activity中启动:

在主Activity中使用startService(Intent)

Intent popupintent=new Intent();
popupintent.setAction("com.service.POPUP_SERVICE");
startService(popupintent);

5.Service监听重力感应而且弹窗:

  • 这里使用Sensor.TYPE_ACCELEROMETER加速度感应器。和其它监听器比方手势等一样,包含声明、注冊、监听等
  • 弹窗使用的是theme定义为dialog。notitle的activity。

弹窗相关代码:

Intent activityIntent = new Intent(this, SelectFriendsActivity.class);
//要想在Service中启动Activity,必须设置例如以下标志
activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(activityIntent);

完整代码:

package com.service;

import com.task.SelectFriendsActivity;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.os.Vibrator;
import android.util.Log;

public class PopupService extends Service implements SensorEventListener{

	//sensorManager
	private SensorManager sensorManager;
	private Vibrator vibrator;
	Intent activityIntent;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}  

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("Service is Created");

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
	    vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    }  

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    	 System.out.println("Service is Started");
    	 //启动service,将serviceon置为TRUE,可弹窗。
    	 SelectFriendsActivity.serviceon = true;
    	 if (sensorManager != null) {// 注冊监听器
             sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
             // 第一个參数是Listener。第二个參数是所得传感器类型。第三个參数值获取传感器信息的频率
         }
    	 activityIntent = new Intent(this, SelectFriendsActivity.class);
         //  要想在Service中启动Activity,必须设置例如以下标志
         activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  

         return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service is Destroyed");

    } 

    /**
     * 重力感应监听
     */
    public void onSensorChanged(SensorEvent event) {
        // 传感器信息改变时运行该方法
        float[] values = event.values;
        float x = values[0]; // x轴方向的重力加速度,向右为正
        float y = values[1]; // y轴方向的重力加速度。向前为正
        float z = values[2]; // z轴方向的重力加速度,向上为正
        Log.i("group", "x轴方向的重力加速度" + x +  ";y轴方向的重力加速度" + y +  "。z轴方向的重力加速度" + z);
        // 一般在这三个方向的重力加速度达到40就达到了摇晃手机的状态。
        int medumValue = 19;// 三星 i9250怎么晃都不会超过20,没办法。仅仅设置19了
        if (Math.abs(x) > medumValue || Math.abs(y) > medumValue || Math.abs(z) > medumValue) {  

            if(SelectFriendsActivity.serviceon){
            	vibrator.vibrate(200);
            	System.out.println("Service:shaked and popup!!!!!!!");
            	startActivity(activityIntent);
            }else{
            	System.out.println("Service:shaked only!!!!!!!");
            }
        }
    }  

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {  

    }  

}

弹出的Activity就是一般的Activity,仅仅只是要在其xml中设置其大小,在AndroidManifest.xml中将其theme设置为notitle。dialog类型

能够使用这个style:

    <style name="dialogTheme" parent="android:Theme.Dialog">
        <item name="android:windowNoTitle">true</item>
    </style>

弹窗要求加入权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

6.Service 保持一直执行,不被杀死
的方法:

重写onDestroy():

    @Override
    public void onDestroy() {
       // super.onDestroy();
       // System.out.println("Service is Destroyed");
          System.out.println("Service is Destroyed,and is Restarted");
          Intent localIntent = new Intent(); localIntent.setClass(this, PopupService.class); //销毁时又一次启动
          Service this.startService(localIntent);
     }

这样不管怎样Service都一直在后台执行了。

7.图文记录:

7.1 启动app,MainActivity中调用了startService(popupintent);

结果:说明依次调用了Service中的onCreate()、onStartCommand()方法,Service開始执行

7.2 震动手机,Service响应弹窗

结果:弹窗,Service正常执行,重力感应器正常执行

7.3 杀死应用进程,震动手机,Service仍然响应弹窗

结果:弹窗,说明尽管应用进程被杀死,可是Service仍保持正常执行,重力感应器正常执行

7.4 点击弹窗的Avtivity中的button,button监听代码:

Intent popupintent=new Intent();
popupintent.setAction("com.service.POPUP_SERVICE");
stopService(popupintent);

即调用了stopService(Intent) 方法

结果:打印出Service
is Destroyed,说明调用了Service的onDestroy()方法

7.5
再次震动手机,发现还是有打印输出:

结果:说名尽管调用了onDestroy()方法。可是其Context未被清除,Service仍然存在

7.6
杀死全部有关此弹窗的进程。再次震动手机。发现没有打印输出了:

结果:一旦其Context被全然清除。Service就真正停止了。

感谢newcj
的博客
文章 Android
中的 Service 全面总结

让我受益匪浅。大家能够去看看,评论区非常精彩:

第一次学着用Service,文中假设有错误请大家指正。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-11 04:29:44

【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行的相关文章

【Android开发日记】初次探秘Android Service!Service开机启动+重力感应+弹窗+保持运行

前言: 最近在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Activity启动和销毁.满足了自己的需求.现记录学习心得.希望能给你带来一些帮助. 1.Service创建:重写4个方法 onBind():返回一个IBinder对象,这个对象可以使应用程序与Service通信.如果用startService.stopService启动和关闭Service的话,Service和访问者是无法通信交换数据的.onBind()返回值设

【Android开发日记】妙用 RelativeLayout 实现3 段布局

在设计过程中,我们经常会遇到这样的需求: 把一条线3控制,左对齐左控制,右侧控制右对齐,中间控制,以填补剩余空间. 或者一列内放3个控件,上面的与顶部对齐,以下的沉在最底部,中间控件是弹性的.充满剩余空间. 情况一:水平布局 图示: 这是第一种情形.因为涉及到ImageView.想保持图片原比例不便使用LinearLayout的weight属性. 解决的方法: 1.外层套一个RelativeLayout 2.三个控件分别装进3个LinearLayout中.假如id分别为leftlayout,mi

Android开发进阶:如何读写Android文件

Android主要有四大主要组件组成:Activity.ContentProvider.Service.Intent组成.Android文件的运行主要需要读写四大组件的文件.本文将介绍如何读写Android文件,希望对正在进行Android开发的朋友有所帮助. 文件存放位置 在Android中文件的I/O是存放在/data/data/<package name>/file/filename目录下. 提示:Android是基于linux系统的,在linux的文件系统中不存在类似于Windows的

Android开发面试经——4.常见Android进阶笔试题(更新中...)

Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359 上一篇文章我们已经了解了Android笔试的一些基础题目, [<Android开发面试经——2.常见Android基础笔试题> ] (http://blog.csdn.net/finddreams/a

[Android开发那点破事]解决android.os.NetworkOnMainThreadException

[Android开发那点破事]解决android.os.NetworkOnMainThreadException 昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡,果断刷机.以前是Android 2.3的系统.回来刷成了4.4. 好了,问题来了.在我用手机测试我们的APP的时候,抛出一个如题的异常:android.os.NetworkOnMainThreadException 第一次看到这异常,字面意思是说:在主线程中的网络异常.然后我就去了解了下这个异常,

勤拂拭软件Android开发之旅(1) 之 Android 开发环境搭建

勤拂拭软件工作室原创出品,欢迎转载,欢迎交流. 转载请注明原文:http://www.cnblogs.com/wangleiblog/p/6019063.html 勤拂拭软件Android开发之旅目录 1 前言 很多朋友都想开始自己的Android开发之旅,但是遇到困难重重.从最开始接触Android开发,从搭建开发环境就花了我大部分时间.所以,作为Android开发第一步,开发环境的搭建,显得基础而重要,下面介绍一种快速搭建Android开发环境的方法,以帮助更多朋友快速上手.本篇文章是讲述在

Android开发面试经——3.常见Android进阶笔试题

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359 上一篇文章我们已经了解了Android笔试的一些基础题目,<Android开发面试经--2.常见Android基础笔试题> 但是做为一个有经验的开发者,仅仅知道基础题还是不够的,你的简历上说有两年以上工作经验的话,那面试官肯定会问一些深入性的问题,看你能否回答的出.所以为了找一个更好的工作,我们还需要去了解一下Android进阶的笔试题目: 1.什么是

android开发里跳过的坑——android studio 错误Error:Execution failed for task &#39;:processDebugManifest&#39;. &gt; Manifest merger failed with multiple errors, see logs

使用AS在gradle里配置了多个定制版本,发现在编译版本切换时,会出现错误: Error:Execution failed for task ':processDebugManifest'.> Manifest merger failed with multiple errors, see logsInformation:Gradle tasks [:app:generatePhoneWulianDebugSources, :app:mockableAndroidJar, :app:prepa

Android 开发艺术探索——第十章 Android的消息机制

Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑. MessageQueue即为消息队列,顾名思义,它的内部存储了一组消息,以队列的的形式对外提供插入和删除的工作.虽然叫队列,但内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表. Looper意思为循