Android开发中Service应用于广播接收者教程

什么是服务:长期后台运行的没有界面的组件,

android是应用场景:
天气预报:后台的连接服务器的逻辑,每隔一段时间获取最新的天气信息
股票显示:后台的连接服务器的逻辑,每隔一段时间获取最新的股票信息
mp3播放器: 后台长期的播放音乐。

new Thread(){}.start(); 子线程没有界面,也是长期后台运行的。

android系统进程管理是按照一定的规则的:

1.应用程序一旦被打开 通常情况下关闭(清空任务栈)后进程不会停止。方面下一次快速启动。

带来内存不足的问题。

2.Android系统有一套 内存清理机制。 按照优先级去回收系统的内存。

进程分为5个等级的优先级:(从高到低)

1.Foreground process 前台进程  用户正在玩的应用程序对应的进程

2.Visible process 可视进程 用户仍然可以看到这个进程的界面。

3.Service process服务进程  应用程序有一个服务组件在后台运行。

4.Background process 后台进程  应用程序没有服务在运行 并且最小化 (activity onstop)

5.Empty process 空进程 没有任何运行的activity, 任务栈空了

长期后台运行的组件,不要在activity开启子线程。

应该是创建服务,在服务里面开启子线程。

 

服务的目的:

1.长期后台运行。

2.提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,把进程重新创建。

    案例场景:使用一个按钮开启服务,在控制台打印服务启动状况。程序界面如下:

开发中Service应用于广播接收者教程-service接收广播">

2 Android清单文件如下:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.itheima.testservice"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="19" />

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.itheima.testservice.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <service android:name="com.itheima.testservice.MyService"></service>

    </application>

 

</manifest>

3 布局文件如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity" >

    <Button

        android:onClick="click"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_centerHorizontal="true"

        android:layout_centerVertical="true"

        android:text="开启服务"/>

</RelativeLayout>

4 MainActivity的代码如下:

package com.itheima.testservice;

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 click(View view) {

                    Intent intent = new Intent(this,MyService.class);

                    startService(intent);

         }

}

5 MyService的代码如下:

package com.itheima.testservice;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

public class MyService extends Service {

         @Override

         public IBinder onBind(Intent intent) {

                   return null;

         }

         //oncreate ondestory onstart onstop onresume onpause

         @Override

         public void onCreate() {

                   System.out.println("服务创建了");

                   super.onCreate();

         }

        

         @Override

         public int onStartCommand(Intent intent, int flags, int startId) {

                   System.out.println("服务器");

                   return super.onStartCommand(intent, flags, startId);

         }

        

         @Override

         public void onDestroy() {

                   System.out.println("服务器销毁了");

                   super.onDestroy();

         }

}

6.关于接受者的说明

四大组件:

Activity
Content provider 内容提供者
Broadcast receiver 广播接受者
Service  服务

电台:   发送广播
收音机: 接受广播

android系统下的广播:

电池电量低。
电池充电完毕
短信到来了
程序安装卸载
sd卡卸载 安装

1.写一个类继承广播接受者
2.在清单文件配置关心的动作
3.一旦广播事件发生了,就会执行广播接受者的onreceive方法

Android通过广播接收者调用服务内方法

Android通过广播接收者调用服务内方法 以及利用代码注册广播接收器(4大组件中唯一可以使用代码声明的组件(activity receiver provider service))

服务;

package com.pas.callmethod;
 
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.widget.Toast;
 
public class MyService extends Service
{
 
    private MyReciver receiver;
     
    @Override
    public void onCreate()
    {
        //采用代码方式注册广播接收者
        receiver=new MyReciver();
        IntentFilter filter=new IntentFilter();
        filter.addAction("com.pas.call");
        registerReceiver(receiver, filter);
        super.onCreate();
    }
     
    @Override
    public void onDestroy()
    {
        unregisterReceiver(receiver);
        receiver=null;
        super.onDestroy();
    }
    @Override
    public IBinder onBind(Intent arg0)
    {
        return null;
    }
 
    private void method_inservice()
    {
        Toast.makeText(getApplicationContext(), "我的服务的方法……", Toast.LENGTH_SHORT).show();
    }
     
    private class MyReciver extends BroadcastReceiver
    {
 
        @Override
        public void onReceive(Context arg0, Intent arg1)
        {
            System.out.println("内部接收者");
            method_inservice();
        }
         
    }
}

MAINAC:

package com.pas.callmethod;
 
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
 
public class MainActivity extends Activity
{
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        Intent intent=new Intent(this,MyService.class);
        startService(intent);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    public void call(View v)
    {
        //发送自定义广播
        Intent intent=new Intent();
        intent.setAction("com.pas.call");
        sendBroadcast(intent);
    }
}

时间: 2024-10-25 10:36:32

Android开发中Service应用于广播接收者教程的相关文章

Android开发中RecyclerView控件使用实例教程

Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下RecyclerView的特点: 1.支持不同方向,不同排版模式,实现多种展现数据的形式,涵盖了ListView,GridView,瀑布流等数据表现的形式 2.内部实现了回收机制,无需我们考虑View的复用情况 3.取消了onItemClick等点击事件,需要自己手动去写 -------------------

android开发中重要组件Activity详细学习教程

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一.它间接继承自android.content.Context,因此,有些时候都直接把Activity实例当做Context的实例来使用. 如前面所提到的要在应用程序中使用Activity,必须在Android Manifest.xml中配置它. 新建一个Android工程,新建过程中勾选creat

Android开发中Activity创建跳转及传值的方法_Android

在Android系统的江湖中有四大组件:活动(Activity), 服务(Service), 广播接收器(Broadcast Reciver)和内容提供者(Content Provider). 今天所介绍的就是Android开发中的四大组件之一:Activity,其他那三大组件以后再进行介绍.说道Android中的Activity,如果你做过iOS开发的话,Activity类似于iOS中的ViewController(视图控制器).在应用中能看到的东西都是放在活动中的.活动是安卓开发比较重要的东

Android开发中使用SQLite 数据库

SQPte 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 SQPte. SQPte 由以下几个组件组成:SQL 编译器.内核.后端以及附件.SQPte 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试.修改和扩展 SQPte 的内核变得更加方便. 图 1. SQPte 内部结构 开发中使用SQLite 数据库-android sqlite数据库"&g

百度地图-在android开发中使用百度LBS定位服务无法稳定准确获得地理位置

问题描述 在android开发中使用百度LBS定位服务无法稳定准确获得地理位置 程序代码如下所示,我是仿照网上的实例编写的,在manifests文件中已经添加了识别码以及百度定位的service,权限也按照百度的说明文档添加好了,在虚拟机中运行效果为无法获取地理位置,错误码62,真机运行则毫无反应,我完全找不到是什么地方出了问题,哪位大大可以帮我看一下吗? import android.os.Bundle; import android.support.v4.app.Fragment; impo

请问大侠,android开发中,摇一摇为什么会执行两次动作?

问题描述 请问大侠,android开发中,摇一摇为什么会执行两次动作? 请问各位大侠,为什么摇一摇的时候,如果摇的比较使劲,估计传感器变化超过两次,就会执行两次或多次动作呀~比如出现好几个代码中的activity package com.cnlaunch.ui; import android.app.Activity; import android.app.Service; import android.content.Intent; import android.hardware.Sensor

Android开发中,那些让你相见恨晚的方法、类或接口

PS:本文内容来自我在知乎上对Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?这一问题的回答,目前就总结这些,日后若有新的发现,随时补充.欢淫点赞. getParent().requestDisallowInterceptTouchEvent(true);剥夺父view 对touch 事件的处理权,谁用谁知道. ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue); 用于根据一个起始颜色

聊天-Android开发中遇到了一个问题,求大神解决下。

问题描述 Android开发中遇到了一个问题,求大神解决下. 我现在将别人写好的聊天软件,根据我自己的需要,剔除了很多不用的activity和功能,然后当成Library.我遇到的问题是,我现在只有进入到这个聊天界面才能够收到信息和来信息的提示,如果我不进入,我就没法得到来消息的提示,请问我该怎么解决呢? 解决方案 就想QQ的离线消息一样?后台起一个Service接收信息,有信息了就在消息通知栏里放一个消息. 解决方案二: 这个问题可能涉及到通知提醒的内容,建议你先看一下android是如何实现

Android编程四大组件之BroadcastReceiver(广播接收者)用法实例_Android

本文实例讲述了Android编程四大组件之BroadcastReceiver(广播接收者)用法.分享给大家供大家参考,具体如下: 这里介绍如何创建广播.如何发送一个无序广播和有序广播.以及监听短信以及监听呼出电话(当我们发短信和打电话,系统就会发一个广播,我们可以拦截此广播进行监听短信以及监听呼出电话). 定义广播接收者 1.定义类继承BroadcastReceiver,重写onReceive方法 2.当接收到匹配广播之后就会执行onReceive方法 3.清单文件中声明<receiver>,