用Android-Studio的IntentService模板快速实现业务需求(实战)

Android IntentService详解(源码分析) 1. 前言 1.1 定义 2.使用方法 3.源码分析 阅读详情
一、用Android-Studio开发工具,新建一个IntentService。

二、勾选“开始方法助手”,其实就是IntentService的模板写法。

三、详细看下模板内容。
package com.czz.manager.service;
import android.app.IntentService;
import android.content.Intent;
import android.content.Context;
/**
 * An {@link IntentService} subclass for handling asynchronous task requests in
 * a service on a separate handler thread.
 * <p>
 * TODO: Customize class - update intent actions, extra parameters and static
 * helper methods.
 */
public class MyIntentService extends IntentService {
    // TODO: Rename actions, choose action names that describe tasks that this
    // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
    private static final String ACTION_FOO = "com.czz.manager.service.action.FOO";
    private static final String ACTION_BAZ = "com.czz.manager.service.action.BAZ";

    // TODO: Rename parameters
    private static final String EXTRA_PARAM1 = "com.czz.manager.service.extra.PARAM1";
    private static final String EXTRA_PARAM2 = "com.czz.manager.service.extra.PARAM2";

    public MyIntentService() {
        super("MyIntentService");
    }

    /**
     * Starts this service to perform action Foo with the given parameters. If
     * the service is already performing a task this action will be queued.
     *
     * @see IntentService
     */
    // TODO: Customize helper method
    public static void startActionFoo(Context context, String param1, String param2) {
        Intent intent = new Intent(context, MyIntentService.class);
        intent.setAction(ACTION_FOO);
        intent.putExtra(EXTRA_PARAM1, param1);
        intent.putExtra(EXTRA_PARAM2, param2);
        context.startService(intent);
    }

    /**
     * Starts this service to perform action Baz with the given parameters. If
     * the service is already performing a task this action will be queued.
     *
     * @see IntentService
     */
    // TODO: Customize helper method
    public static void startActionBaz(Context context, String param1, String param2) {
        Intent intent = new Intent(context, MyIntentService.class);
        intent.setAction(ACTION_BAZ);
        intent.putExtra(EXTRA_PARAM1, param1);
        intent.putExtra(EXTRA_PARAM2, param2);
        context.startService(intent);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_FOO.equals(action)) {
                final String param1 = intent.getStringExtra(EXTRA_PARAM1);
                final String param2 = intent.getStringExtra(EXTRA_PARAM2);
                handleActionFoo(param1, param2);
            } else if (ACTION_BAZ.equals(action)) {
                final String param1 = intent.getStringExtra(EXTRA_PARAM1);
                final String param2 = intent.getStringExtra(EXTRA_PARAM2);
                handleActionBaz(param1, param2);
            }
        }
    }

    /**
     * Handle action Foo in the provided background thread with the provided
     * parameters.
     */
    private void handleActionFoo(String param1, String param2) {
        // TODO: Handle action Foo
        throw new UnsupportedOperationException("Not yet implemented");
    }

    /**
     * Handle action Baz in the provided background thread with the provided
     * parameters.
     */
    private void handleActionBaz(String param1, String param2) {
        // TODO: Handle action Baz
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
第一:四个私有的、静态的和最终的常量。两个用来Action标识,两个用来参数标识。
题外话:为什么用 ACTION_FOO , ACTION_BAZ 来标识两个动作。FOO与BRZ的含义是什么?
答案的 网址:https://en.wikipedia.org/wiki/Foobar ;
第二:有 startActionFoo , startActionBaz ,来分别启动不同的Service。
          启动 Service的 时候,顺便传参 EXTRA_PARAM1 , EXTRA_PARAM2 ,
第三:核心就是 onHandleIntent ,方法 intent 不为null,同时取得的匹配则调用相应的方法 handleActionFoo , handleActionBaz 。

四、实战IntentService。
业务需求:在 Service里开启次线程请求网络数据,将返回的数据通过广播( Broadcast )传给活动(Activity),更新UI视图。
IntentService+Thread+Broadcast+Activity。
根据官方提供的模板,填写自己的类。
(1)自定义IntentService类:
package com.czz.manager.service;
import android.app.IntentService;
import android.content.Intent;
import android.content.Context;
import com.czz.manager.bean.NewsInfo;
import com.czz.manager.bean.WeatherInfo;
import java.util.ArrayList;

public class TestIntentService extends IntentService {

    //TODO :①定义ACTION常量,action_news和action_weather,即“新闻”和“天气”
    private static final String ACTION_NEWS = "com.czz.manager.service.action.NEWS";
    private static final String ACTION_WEATHER = "com.czz.manager.service.action.WEATHER";

    //TODO :②启动Service,需要传一些参数
    private static final String EXTRA_PARAM1 = "com.czz.manager.service.extra.PARAM1";
    private static final String EXTRA_PARAM2 = "com.czz.manager.service.extra.PARAM2";

    //TODO :③获得结果之后需要用Broadcast将结果发送给Activity以更新UI视图
    private static final String NEWS_RESULT = "com.czz.manager.service.RESULT.NEWS";
    private static final String WEATHER_RESULT = "com.czz.manager.service.RESULT.WEATHER";
    //TODO :④发送广播,需要传入的一些参数
    private static final String EXTRA_PARAM3 = "com.czz.manager.service.extra.PARAM3";
    private static final String EXTRA_PARAM4 = "com.czz.manager.service.extra.PARAM4";

    public TestIntentService() {
        super("TestIntentService");
    }
    public static void startActionNEWS(Context context, String param1, String param2) {
        Intent intent = new Intent(context, TestIntentService.class);
        intent.setAction(ACTION_NEWS);
        intent.putExtra(EXTRA_PARAM1, param1);
        intent.putExtra(EXTRA_PARAM2, param2);
        context.startService(intent);
    }

    public static void startActionWEATHER(Context context, String param1, String param2) {
        Intent intent = new Intent(context, TestIntentService.class);
        intent.setAction(ACTION_WEATHER);
        intent.putExtra(EXTRA_PARAM1, param1);
        intent.putExtra(EXTRA_PARAM2, param2);
        context.startService(intent);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_NEWS.equals(action)) {
                final String param1 = intent.getStringExtra(EXTRA_PARAM1);
                final String param2 = intent.getStringExtra(EXTRA_PARAM2);
                handleActionNEWS(param1, param2);
            } else if (ACTION_WEATHER.equals(action)) {
                final String param1 = intent.getStringExtra(EXTRA_PARAM1);
                final String param2 = intent.getStringExtra(EXTRA_PARAM2);
                handleActionWEATHER(param1, param2);
            }
        }
    }

    private void handleActionNEWS(String param1, String param2) {

        //次线程里操作网络请求数据
        new Thread(new Runnable() {
            @Override
            public void run() {
                ArrayList<NewsInfo> arrayList = getNews();
                Intent intent = new Intent(NEWS_RESULT);
                // 此处传送的数据的是集合类型,也可以有其他的类型:intent.put
                intent.putParcelableArrayListExtra(EXTRA_PARAM3, arrayList);
                sendBroadcast(intent);
            }
        }).start();
    }

    private void handleActionWEATHER(String param1, String param2) {
        //次线程里操作网络请求数据
        new Thread(new Runnable() {
            @Override
            public void run() {
                ArrayList<WeatherInfo> arrayList = getWeather();
                Intent intent = new Intent(WEATHER_RESULT);
                // 此处传送的数据的是集合类型
                intent.putParcelableArrayListExtra(EXTRA_PARAM4, arrayList);
                sendBroadcast(intent);
            }
        }).start();
    }

    private ArrayList<WeatherInfo> getWeather() {
        ArrayList<WeatherInfo> list=null;
        // 从网络上的JSON数据转为集合,可以是[retrofit2]框架异步操作
        // ...
        return list;
    }

    private ArrayList<NewsInfo> getNews() {
        ArrayList<NewsInfo> list=null;
        // 从网络上的JSON数据转为集合
        // ...
        return list;
    }
}

(2)Activity:
package com.czz.manager.service;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.czz.manager.R;
import com.czz.manager.bean.NewsInfo;
import com.czz.manager.bean.WeatherInfo;

import java.util.ArrayList;

public class TestActivity extends AppCompatActivity {

    //TODO :③获得结果之后需要用Broadcast将结果发送给Activity以更新UI视图
    private static final String NEWS_RESULT = "com.czz.manager.service.RESULT.NEWS";
    private static final String WEATHER_RESULT = "com.czz.manager.service.RESULT.WEATHER";
    //TODO :④发送广播,需要传入的一些参数
    private static final String EXTRA_PARAM3 = "com.czz.manager.service.extra.PARAM3";
    private static final String EXTRA_PARAM4 = "com.czz.manager.service.extra.PARAM4";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        //注册广播,以接收Service通过广播发送过来的数据
        registerReceiver();
        //启动服务
        TestIntentService.startActionNEWS(this, null, null);
        TestIntentService.startActionWEATHER(this, null, null);
    }

    private void registerReceiver() {
        IntentFilter filter = new IntentFilter();
        //区分多种广播
        filter.addAction(NEWS_RESULT);
        filter.addAction(WEATHER_RESULT);
        registerReceiver(receiver, filter);
    }

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(NEWS_RESULT)) {
                Log.i("mylog", "NEWS广播接收器中...");
                ArrayList<NewsInfo> arrayList = intent.getParcelableArrayListExtra(EXTRA_PARAM3);
                //获取到了数据,进行一些UI更新...
            } else if (intent.getAction().equals(WEATHER_RESULT)) {
                Log.i("mylog", "WEATHER广播接收器中...");
                ArrayList<WeatherInfo> arrayList = intent.getParcelableArrayListExtra(EXTRA_PARAM4);
                //获取到了数据,进行一些UI更新...
            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}

(3)JavaBean:
此处给出NewsInfo类,Weather类省略。需要实现Parcelable接口
package com.czz.manager.bean;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by XiuChou on 2016/8/19
 */

public class NewsInfo implements Parcelable {

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeString(article_url);
        out.writeString(behot_time);
        out.writeInt(bury_count);
        out.writeInt(digg_count);
        out.writeInt(repin_count);
        out.writeInt(create_time);
        out.writeInt(publish_time);
        out.writeString(source);
        out.writeString(title);
    }

    public static final Parcelable.Creator<NewsInfo> CREATOR = new Parcelable.Creator<NewsInfo>() {
        public NewsInfo createFromParcel(Parcel in) {
            return new NewsInfo(in);
        }

        public NewsInfo[] newArray(int size) {
            return new NewsInfo[size];
        }
    };

    private NewsInfo(Parcel in) {
        article_url = in.readString();
        behot_time = in.readString();
        bury_count = in.readInt();
        digg_count = in.readInt();
        repin_count = in.readInt();
        create_time = in.readInt();

        publish_time = in.readInt();

        source = in.readString();
        title = in.readString();

    }

    private String article_url;//Http,Url
    private String behot_time;//时间

    private int bury_count;//踩数
    private int digg_count;//点赞数
    private int repin_count;//收藏数

    private int create_time;//创建时间

    private String group_id;
    private int publish_time;//发布时间

    private String source;//来源
    private String title;//新闻标题

    public int getCreate_time() {
        return create_time;
    }

    public int getDigg_count() {
        return digg_count;
    }

    public String getGroup_id() {
        return group_id;
    }

    public int getPublish_time() {
        return publish_time;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public int getRepin_count() {
        return repin_count;
    }

    public void setRepin_count(int repin_count) {
        this.repin_count = repin_count;
    }

    public void setPublish_time(int publish_time) {
        this.publish_time = publish_time;
    }

    public void setGroup_id(String group_id) {
        this.group_id = group_id;
    }

    public void setDigg_count(int digg_count) {
        this.digg_count = digg_count;
    }

    public void setCreate_time(int create_time) {
        this.create_time = create_time;
    }

    public int getBury_count() {
        return bury_count;
    }

    public void setBury_count(int bury_count) {
        this.bury_count = bury_count;
    }

    public String getArticle_url() {
        return article_url;
    }

    public void setArticle_url(String article_url) {
        this.article_url = article_url;
    }

    public String getBehot_time() {
        return behot_time;
    }

    public void setBehot_time(String behot_time) {
        this.behot_time = behot_time;
    }

    @Override
    public String toString() {
        return "NewsInfo{" +
                "article_url='" + article_url + '\'' +
                ", behot_time='" + behot_time + '\'' +
                ", bury_count=" + bury_count +
                ", digg_count=" + digg_count +
                ", repin_count=" + repin_count +
                ", create_time=" + create_time +
                ", group_id='" + group_id + '\'' +
                ", publish_time=" + publish_time +
                ", source='" + source + '\'' +
                ", title='" + title + '\'' +
                '}';
    }
}
实现效果图:


博主认为还需改进的地方就是启动服务的方法在Service里设置则需要设置为static的,这样在Activity中要启动Service则需要[类名].[方法名],耦合姓太高。
建议讲启动Service的方法定义在Activity中。

 
 
Cursor 3.0实战:用自然语言开发安卓APP 自然语言编程正从概念走向工程落地——它不是替代开发者,而是将软件开发的核心动作从‘写代码’升维为‘表达需求’。其底层依赖智能体(Agent)协同、Composer混合专家架构与强化学习驱动的决策逻辑,实现对Android SDK、Room数据库、CameraX、RESTful API等技术栈的零认知调用。用户无需掌握Kotlin语法或Gradle配置,仅需描述业务目标(如‘扫码更新库存’‘低于5件弹红框提醒’),系统即可自动生成可编译、可调试、可上架的原生APK。该范式显著降低中小业务方、产品经理与个体创业 阅读详情

相关推荐

使用JADX-GUI逆向分析Android SDK:从黑盒集成到主动审查

在Android开发中,第三方SDK的集成常面临安全与性能的“黑盒”挑战。通过逆向工程技术,开发者可以深入理解SDK的内部机制,从被动集成转变为主动审查。JADX-GUI作为一款图形化反编译工具,能够将APK中的DEX字节码还原为可读的Java源代码,极大降低了逆向分析的门槛。其核心价值在于帮助开发者排查崩溃、审查权限、追踪网络行为及评估安全风险,尤其适用于分析启动耗时、敏感数据收集等具体问题。本文以广告SDK启动优化为例,展示了如何通过代码流分析与网络请求追踪定位性能瓶颈,为工程实践中的SDK选型与问题排

319

Android Studio的代码笔记--IntentService学习

intentservice本质是一个 HandlerThread工作线程,通过Handler实现把消息加入消息队列中等待执行,通过传递的intent在onHandleIntent中处理任务。

weixin_45208598的博客 736

Kotlin 封装 SharedPreferences 的最佳实践与避坑指南

SharedPreferences 是 Android 平台最轻量的键值存储机制,其核心价值在于毫秒级同步读写、零 IPC 开销与确定性行为。它并非被 DataStore 取代,而是与之形成分工:SP 适用于简单类型、小数据量、高响应要求的场景,如主题开关、登录状态、临时配置等;而 DataStore 更适合结构化、强一致性、需事务保障的数据。Kotlin 通过扩展函数、委托属性和密封类,显著提升 SP 的类型安全、可维护性与工程鲁棒性,有效规避运行时 ClassCastException、空指针及未提交风

weixin_34072458的博客 594

安卓开发学习18-3:Service应用:Intent Service

为什么使用Intent Service使用创建基本使用 为什么使用Intent Service 对于普通的Service,处理耗时任务,需要手动创建线程进行处理,不然阻塞主线程,会弹出程序长时间无响应的提示,用户体验不好 如果使用Service处理,就需要手动创建线程进行异步处理任务,并且还要手动停止服务,显然不方便,Intent Service就是用来处理这种情况,更为简便 使用 Intent Service的启动方式是差不多的 创建 以下是通过Android Studio进行创建,这种方式会自动在.

qq_43967413的博客 710

Android Intent Service BroadCast AndroidStudio

本项目将Android中的Intent总结了一遍。主要有四个项目,Intent_Intent项目是简单的Intent跳转(setActivityResult);Intent_broadcast主要是静态广播的注册;Intent_broadcastdynamic主要介绍动态广播的注册;intent_service主要是启动服务来播放音乐(我今年正好十八岁-阿正)。 本项目使用Android Studio 1.4 编写。

深入剖析Android系统中Service和IntentService的区别

主要介绍了Android系统中Service和IntentService的区别,与普通的服务相比,IntentService可以开启单独的线程来处理intent请求,需要的朋友可以参考下

Android之IntentService的使用

通过前面的学习,大家会发现我们在使用 Service 时总会创建一个线程来执行任务,而不是直接在 Service中执行。这是因为 Service 中的程序仍然运行于主线程中,当执行一项耗时操作时,不新建一个线程的话很容易导致 Application Not Responding 错误。当需要与 UI线程进行交互时,使用 Handler 机制来进行处理。 为了简化操作,Android提供了IntentService类。IntentService是 Android中提供的后台服务类,是Service 自动实现

PPYY3344的博客 2355

R语言实战:非正态数据下的Scheirer–Ray–Hare检验全流程解析

本文详细解析了在R语言中执行Scheirer–Ray–Hare检验的全流程。当数据不满足正态分布假设时,该非参数检验是传统双因素方差分析的有效替代方案。文章从原理、R环境配置、数据准备、代码实现、结果解读到事后比较与可视化,提供了完整的实战指南,帮助研究者稳健地分析多因素实验设计中的主效应和交互效应。

cc789的博客 406

【Android】IntentService的使用

相比Service,IntentService变得更加简单,它会自动开启新线程去执行代码,而且执行完之后还会自己停止服务。下面记录IntentService的简单使用方法 一、layout布局 就放一个button就好 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr...

冰冷的希望的博客 478

VSCode终端打不开?3分钟搞定Windows下Terminal配置(附最新JSON设置方法)

本文针对Windows系统下VSCode终端无法启动的常见问题,提供了详细的诊断与解决方案。核心在于更新已弃用的旧配置,采用最新的JSON设置方法,通过定义`terminal.integrated.profiles.windows`和指定`terminal.integrated.defaultProfile.windows`,快速修复并优化终端配置,实现三分钟内恢复正常使用。

flower的专栏 741

倍福Beckhoff运动控制功能块实战解析:从MC_ReadActualPosition到MC_GearInVelo

本文深入解析倍福(Beckhoff)TwinCAT运动控制功能块,从基础的MC_ReadActualPosition、MC_Power等轴状态读取与使能操作,到MC_MoveAbsolute、MC_MoveRelative等单轴定位指令,并重点剖析了用于动态速度同步的核心功能块MC_GearInVelo在飞锯等场景的应用。文章结合实战经验,详细介绍了齿轮耦合、电子凸轮(MC_CamIn)等高级同步功能的参数配置、调试技巧及常见问题,旨在帮助工程师快速掌握倍福运动控制工具箱,实现复杂的同步工艺。

transformer2023的博客 981

Android性能优化实战:工具链与关键技术解析

性能优化是移动应用开发的核心课题,特别是在Android平台的碎片化环境下。通过CPU、内存、网络等系统资源的合理调度,开发者可以显著提升应用的启动速度、界面流畅度和电池续航。Android Studio Profiler提供了全方位的性能分析能力,而systrace等系统工具则能深入诊断渲染性能和线程调度问题。在内存管理方面,LeakCanary等工具帮助开发者预防内存泄漏,而对象池化和图片格式优化则能有效降低GC压力。列表渲染优化和启动加速技术进一步提升了用户体验。这些优化技术最终需要通过Android

340

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

随着文档处理需求的增加,格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性,将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件,提供了这样的转换功能,使得用户可以轻松地在Word和PDF之间进行转换。

ONLYOFFICE的官方博客 4569

Android平台FFmpeg集成指南:从编译到JNI调用的完整实践

音视频处理是移动应用开发中的常见需求,涉及编解码、格式转换、剪辑合成等核心技术。其原理基于对多媒体数据的解析、转换与重构,通过算法实现高效处理。在Android开发中,本地音视频处理能力能显著提升应用性能与用户体验,避免云端传输延迟,增强离线功能。FFmpeg作为开源音视频处理库,提供了完整的解决方案,支持多种编解码器和封装格式。通过JNI技术,开发者可将FFmpeg集成到Android应用中,实现视频转码、音频提取等核心功能。本文详细介绍了FFmpeg在Android平台的编译配置、CMake集成及JNI

weixin_34151004的博客 402

IAR编译相同工程生产hex文件checksum不一致问题

IAR Checksum

xqw19891201的博客 1383

修改yolov8使支持单通道图像输入

默认支持BGR三通道图像输入,但是在很多工业场景下,存在很多灰度图像的场景,因此对yolov8代码做一些修改以支持单通道图像输入,满足项目实际需求。训练时,只需要在 data 的 yaml 文件中,添加 ch=1 即可。

mingo_敏 5779

Android开发规范:提升团队协作与代码质量的关键实践

在移动应用开发中,Android开发规范是确保代码质量和团队协作效率的基石。通过统一的代码风格、资源管理和组件使用规范,开发者能够有效降低维护成本并提升应用性能。从基础的命名规则(如逆域名包名、驼峰式命名法)到高级的内存优化技巧(如Bitmap处理、线程池配置),规范的建立涉及开发全流程。特别是在大型项目中,规范的执行能显著减少技术债务,这一点在Activity生命周期管理和Service使用等场景中尤为关键。随着项目规模扩大,结合静态检查工具(如detekt)和持续集成(如Jenkins流水线)的规范体系

weixin_30254435的博客 416

全功能爬虫框架:Botasaurus 的详细使用(现代化、反检测、高并发的智能爬虫框架)

Botasaurus是一个基于 Python 的全栈式智能数据采集框架。它深度融合了以下关键技术: 无头浏览器自动化(Headless Browser Automation):基于 Playwright 或 Puppeteer,支持 Chromium、Firefox、WebKit; 高级反检测引擎(Anti-Detection Engine):自动绕过 WebDriver、Canvas、AudioContext 等 50+ 种指纹检测; 声明式任务模型(Declarative Task Model):用装

数据知道的博客 4370

Android开发规范:提升代码质量与团队协作效率

Android开发规范是确保代码质量和团队协作效率的重要保障。在移动应用开发中,良好的代码组织、命名约定和组件使用规范能够显著提升应用性能和可维护性。通过统一的包结构划分和命名规则,开发者可以快速理解代码逻辑,减少维护成本。在性能优化方面,内存管理和布局优化是关键,如避免内存泄漏和使用ConstraintLayout减少层级。安全规范则涉及数据存储和网络通信,推荐使用EncryptedSharedPreferences和HTTPS证书固定。团队协作中,代码审查和Git工作流实践不可或缺,而工具链统一配置和测

wangqiaowqo的专栏 447

uniapp 如何封装实现任意页面都能使用的全局弹窗

项目内容场景全局监听消息提示难点uniapp 无法全局挂载组件解决方案动态创建 DOM + 动态 Vue 实例优势跨页面 / 不依赖页面组件树 / 灵活调用如果你使用的是小程序平台,DOM 操作可能受限,需要用或方式兼容处理。想支持多个弹窗堆叠?你可以扩展,加个弹窗队列管理器。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 944

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

基于BLE与Android的智能安全设备开发:从Puck.js到紧急求助系统

蓝牙低功耗(BLE)技术作为物联网设备通信的核心协议之一,以其极致的功耗控制和快速连接特性,成为可穿戴设备、智能家居等场景的首选方案。其工作原理基于服务与特征值模型,通过订阅通知实现设备与移动端的高效、低功耗数据交换。在工程实践中,BLE技术能够支撑起长时间待机、快速响应的应用需求,尤其适用于对功耗和实时性有严格要求的场景。结合Android平台的背景服务与权限管理机制,可以构建稳定可靠的后台监听应用。本文以个人安全设备“Talos”为例,详细解析了如何利用Puck.js硬件模块与Android前台服务,实

weixin_30417487的博客 630

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android面试进阶:从生命周期到架构设计,掌握核心原理与工程实践

在Android开发领域,理解核心组件原理与系统机制是构建稳定、高性能应用的基础。Activity、Fragment等组件的生命周期管理,不仅是面试高频考点,更是处理页面状态、数据恢复与内存管理的工程实践核心。其背后涉及系统对应用进程与任务栈的调度原理,深刻理解这些机制,能有效避免内存泄漏与状态不一致问题,提升应用健壮性。随着Jetpack架构组件的普及,ViewModel、LiveData等现代技术方案,为数据驱动UI和生命周期感知编程提供了标准化支持,推动了MVVM等架构模式在工程中的落地。这些技术价值

weixin_33713350的博客 476

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android中的IntentService以及它的实现原理

Android中的IntentService以及它的实现原理

QYgujingjing的专栏 382

服务Service与IntentService

是能够在后台长时间执行操作并且不是供用户界面的应用程序组件。Senice可以与其他组件进行交互,一般由Activity启动,但是并不依赖于Activity。Service通常被称为“后台服务”,其中“后台”一词是相对于前台而言的,。除此之外,Service还具有较长时间运行特性,它的应用场景主要有两个,分别是后台运行和跨进程访问。1.后台运行:Senvice可以在后台长时间进行操作而不用提供界面信息,只有当系统必须要回收内存资源时,才会被毁,否则Service会一直在后台运行。

m0_57150356的博客 886

Android——intentservice介绍

缺点明显: 使用handler进行异步处理时,容易产生内存泄漏问题。固然可以通过将handler设置为静态内部类,解决这个问题,但是将handler设置为静态内部类后就无法引用内部成员变量。 内存泄漏原因: Activity要销毁时,消息队列里消息没处理完,Message Queue默认引用handler,handler默认引用activity。 第二种:使用IntentService(异步任务处理服务) 优点:可以在后台执行,不受Activity生命周期影响。(只能通过startActivi

qq_47112287的博客 4645

Android中IntentService详解

简单说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的

IT_51888_liang的博客 744
上一篇: 让你的Android项目更加整洁与清晰
下一篇: [RK3288][Android7.1.2] kernel移植 : rk808+edp
雙重底
博客等级 码龄12年 28粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值