前言

我在Unity3D调用Android功能与组件(十)—BroadcastReceiver中介绍了如何使用Unity接入广播。

然而很多没有做过Android的小伙伴却表示

[这是神马玩意儿?干啥用的?]

那我也只能

其实,广播作为Android四大组件之一,其妙用之处太多太多。你可以用来做应用自启动,也可用来做智能网络检测、电量优化大师、定位器等等。

秉着让大家少走一步弯路的原则,我还是在这里单独发一篇帖子与大家分享。感兴趣的小伙伴还是建议多看看Unity3D调用Android功能与组件(十)—BroadcastReceiver这篇,因为有更高的自由度任你发挥。

正文:

1.首先申请相应权限

在AndroidMenifest.xml中添加下列权限,可根据自己需要酌情增减

[XML] 纯文本查看 复制代码
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/>
<uses-permission android:name="android.permission.BIND_SCREENING_SERVICE"/>
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>

温馨提示:请妥善使用权限,坚决不申请用不到的权限

2.添加广播接收

[XML] 纯文本查看 复制代码
<receiver
        android:name=".SelfWakeBroadcastReceiver"
        android:process=":remote">
        <intent-filter android:priority="90000">
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.DATE_CHANGED" />
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.SCREEN_OFF" />
            <action android:name="android.intent.action.SCREEN_ON" />
 
            <category android:name="android.intent.category.HOME" />
 
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>

在AndroidMenifest.xml中把上面的代码加到Application标签里面。

3.Java源码及打包

[Java] 纯文本查看 复制代码
package com.unity3d.player;
  
import java.util.List;
  
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.util.Log;
  
/**
 * Created by User on 2016/11/19.
 */
  
public class SelfWakeBroadcastReceiver extends BroadcastReceiver {
  
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v("SelfWakeBroadcast""has Receive a broadcast");
        RunApp(context,"com.hhu.virtualhair");//TODO 换成自己的包名
    }
  
    public void registerScreenActionReceiver(Context mContext) {
  
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_USER_PRESENT);
        mContext.registerReceiver(SelfWakeBroadcastReceiver.this, filter);
    }
   
      
    private void RunApp(Context context,String packageName) { 
        PackageInfo pi; 
        try 
            pi = context.getPackageManager().getPackageInfo(packageName, 0); 
            Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); 
            resolveIntent.setPackage(pi.packageName); 
            PackageManager pManager = context.getPackageManager(); 
            List<ResolveInfo> apps = pManager.queryIntentActivities( 
                    resolveIntent, 0); 
    
            ResolveInfo ri = apps.iterator().next(); 
            if (ri != null) {
                String className = ri.activityInfo.name; 
                Intent intent = new Intent(Intent.ACTION_MAIN); 
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                ComponentName cn = new ComponentName(ri.activityInfo.packageName, className);
                intent.setComponent(cn);
                context.startActivity(intent);
            
        catch (NameNotFoundException e) { 
            e.printStackTrace(); 
        
    
    }
}

把上述Java代码中的//TODO 换成自己的包名处的报名替换为自己应用的报名;

将上述代码打包成.jar;

把打包好的jar文件放到Unity的/Assets/Plugins/Android/文件夹下。

4.大功告成!

发布你的软件或游戏,享受自启的快感!

--------------------------------2018.09.06--更新----------------------

本帖子内容实际上是2016年的一个回答,由于时间比较久远,随着Android系统的升级,可能某些小伙伴使用本帖子提供的教程会出问题,MemoryC也没来得及去测试与更正。

最近交流群里三位小伙伴一起探讨了一个方案,我把他们得出的教程粘在这里,有需要的码友可参考下。

Unity3D调用Android功能与组件(10.1):应用自启动
http://www.manew.com/thread-139699-1-1.html
(出处: -【游戏蛮牛】-游戏出海,ar增强现实,虚拟现实,unity3d,unity3d教程下载首选u3d,unity3d官网)

Unity3D调用Android功能与组件(10.1):应用自启动的更多相关文章

  1. Unity3D 调用Android与IOS的剪贴板

    Unity3D剪贴板 最近遇到一个需要调用Android与IOS设备本身剪贴板的需求,就是在Unity中,要将文本复制到设备本身的剪贴板中,然后在其他应用程序中都能粘贴. 最开始在网上查到的方式是使用 ...

  2. Unity3D调用android方法(非插件方式)

    关于Unity3Dproject与androidproject的转换与合并,请參考我的另外一篇博客.假设你对Unity3Dproject增加到androidproject的过程不熟悉.也请先看完以下这 ...

  3. [Unity3D]调用Android接口

    简介 有一些手机功能,Unity没有提供相应的接口,例如震动,例如不锁屏,例如GPS,例如... 有太多的特殊功能Unity都没有提供接口,这时候,我们就需要通过使用Android原生的ADT编辑器去 ...

  4. [原] unity3d调用android版 人人sdk

    开发过程 遇到天坑:纯android工程没问题,集成到unity3d中 就老提示 没登陆 .最后跟到底 发现是Util.java 中 openUrl 函数出的bug.unity3d 中调android ...

  5. [原]unity3d调用android webView

    1.配置dialog xml文件: <resources>    <style name="dialogStyleWindow" parent="@an ...

  6. 调用Android自带日历功能(日历列表单、添加一个日历事件)

    调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...

  7. Unity3d和Android之间互相调用

    摘抄博客 Unity3d Android SDK接入解析(一)Unity3d 与 Android之间的互相调用,一共四章,一定要看完 No1: 总体来说Unity3d与Android之间的互相调用,是 ...

  8. Android 调用摄像头功能【拍照与视频】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ma_hoking/article/details/28292973 应用场景: 在Android开发 ...

  9. Delphi xe7 up1 调用android振动功能

    Delphi xe7 up1 调用android振动功能 振动用到以下4个单元: Androidapi.JNI.App,Androidapi.JNIBridge,Androidapi.JNI.Os,A ...

  10. java程序员图文并茂细说Unity中调用Android的接口

    http://bbs.csdn.net/topics/391876421 最近做一个项目,为同事提供接口,能使他在Unity中调用Android中的函数来实现QQ登陆并获取用户信息.按照一些书上和一些 ...

随机推荐

  1. P7368 [USACO05NOV]Asteroids G

    题面 贝茜想在 \(N\times N\) 的网格中驾驶她的宇宙飞船.网格中有 \(K\) 个小行星.要使驾驶过程愉快,就必须把这些小行星全部消除. 贝茜有一个武器,可以以一个单位代价消除一行或一列的 ...

  2. Hugging Face - 推理(Inference)解决方案

    每天,开发人员和组织都在使用 Hugging Face 平台上托管的模型,将想法变成概念验证(proof-of-concept)的 demo,再将 demo 变成生产级的应用. Transformer ...

  3. 电脑本地安装不同版本MySQL

    本地已经安装了mysql5.7版本,想测试mysql8版本的用法,想在一台电脑同时配置不同版本的mysql在不同端口号,看起来简单,实现起来其实挺多坑的,总结下实战经验和大家分享下 一.下载安装 下载 ...

  4. java入门与进阶P-2.3

    判断 if语句 一个基本的if语句由一个关键字if开头,跟上在括号里的表示条件的逻辑表达式, 然后是一对大括号"{}"之间的若干条语句.如果表示条件的逻辑表达式的结果为true,那 ...

  5. elasticsearch中使用runtime fields

    1.背景 在我们使用es的开发过程中可能会遇到这么一种情况,比如我们的线路名称字段lineName字段在设置mapping的时候使用的是text类型,但是后期发现需要使用这个字段来进行聚合操作,那么我 ...

  6. Spring04-AOP(Debug查看执行流程)

    1 AOP的几个核心技术 AOP-面向切面编程的实现的核心技术:jvm运行期间对字节码进行修改或者动态生成新的字节码文件(asm技术). 2 AOP的几个核心概念 AOP在运行期间我们要对class文 ...

  7. 逻辑运算符、成员运算符、身份运算符、流程控制、if判断、while循环

    目录 一.逻辑运算符 二.成员运算符 三.身份运算符 四.流程控制 五.分支结构 (1).单if判断 (2).双分支结构 (3).多分支结构 (4).if的嵌套使用 六.循环结构while (1).w ...

  8. ubuntu18.04下联想电脑不能打开wifi

    一.问题描述: 本人使用联想拯救者14IFI笔记本在安装Ubuntu系统时会出现无线硬件开关关闭的问题,当然也就无法连网(Wi-Fi). (最好先使用 sudo rfkill unblock all) ...

  9. 学习Java Day12

    今天学习了多维数组

  10. DELLR740服务器安装centos7.9操作系统时发现无法检测到硬盘

    问题:RAID卡:PERC H750 安装centos7.9操作系统时发现无法检测到硬盘 解决办法: 1.需要先配置RAID2.如果不配RAID的话,需要在F2选项中的RAID配置中开启NON-RAI ...