2Pascal-新时代的Pascal

标题: 安卓 服务 的 一些 相关代码,自动启动服务或定时启动APP。 [打印本页]

作者: wang_80919    时间: 2016-12-4 17:59
标题: 安卓 服务 的 一些 相关代码,自动启动服务或定时启动APP。
很久以前,有很多人问如何自动启动 APP,我说去抄 JAVA ,没人相信。
也有人问 如何用定时器,我也说 去抄 Java。也没人相信。

在 XE5 末期,我就实现了 开机自启动。
XE7 的时候,写了一个简单的 WORD 文档。

现在已经过去很久了,先公开一部分代码吧。

下面是调用代码。
[mw_shl_code=delphi,true]const
  FlyReceiverClass = 'com.delphi.flying.CommonReceiver';
  FlyReceiverDefaultAction = 'com.delphi.flying.BootReceiver.Default';

procedure TForm1.Button2Click(Sender: TObject);
var
  PendingIntent: JPendingIntent;
  Intent: JIntent;
  FireDate: TDateTime;
  ACommonReceiver: JCommonReceiver;
begin
  Intent := TJIntent.Create;
  ACommonReceiver := TJCommonReceiver.JavaClass.init;
  Intent.setClass(TAndroidHelper.Context, ACommonReceiver.getClass);
  //由于 Recevicer 写了一个 getAction 的代码,这里随便传一个吧。
  Intent.setAction(StringToJString(FlyReceiverDefaultAction));
  Intent.putExtra(StringToJString('AutoRunApp'), StringToJString('1'));
  PendingIntent := TJPendingIntent.JavaClass.getBroadcast(
    TAndroidHelper.Context, 0, Intent,
    TJPendingIntent.JavaClass.FLAG_UPDATE_CURRENT);
  FireDate := Now + Round((SpinBox1.Value / 60) / 24) +
     EncodeTime(Round(SpinBox1.Value / 60) mod 24,
       Round(SpinBox1.Value) mod 60, Round(SpinBox2.Value), 0);
  if CheckBox1.IsChecked then
  begin
    TAndroidHelper.AlarmManager.&set(
      TJAlarmManager.JavaClass.RTC_WAKEUP,
        DateTimeToUnix(FireDate),
          PendingIntent);
  end
  else
  begin
    TAndroidHelper.AlarmManager.&set(
      TJAlarmManager.JavaClass.RTC,
        DateTimeToUnix(FireDate),
          PendingIntent);
  end;
  Application.Terminate;
end;[/mw_shl_code]

上面没看到定时器代码吗?


后来,完整教程公开了,下面是地址。

安卓服务,自启动,开机运行app 简单教程
http://2pascal.com/forum.php?mod ... =2977&fromuid=4
(出处: 2Pascal-新时代的Pascal)

作者: wang_80919    时间: 2016-12-4 17:59
此 Java 代码只是示例,建议用多个 java 代码 来 收多个不同类型的 消息。
可以建立一个 基类 来处理公用部分。
派生的 Java 代码 负责特定类型的消息。






java 代码 需编译为 jar ,加入工程中。
jar 调用接口,需转换为 pas ,加入到工程中。
具体 编译和转换,请到别的帖子找。
作者: wang_80919    时间: 2016-12-4 18:00
[mw_shl_code=delphi,true]procedure TAndroidServiceDM.AndroidServiceStratApp(Msg:string);
var
  launchintent: JIntent;
begin
  launchintent := TJIntent.JavaClass.init;
  launchintent.setClassName(
    TAndroidHelper.Context,
      StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));
  launchintent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  launchintent.putExtra(StringToJString('FlyService'),
    StringToJString('1'));
  launchintent.putExtra(StringToJString(Msg),
  StringToJString('1'));
  TAndroidHelper.Context.startActivity(launchintent);

  PostToast('APP 通过服务启动了!');
end;


function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
var
  MyNotification : TNotification;
  AVal: JString;
begin
  Result := TJService.JavaClass.START_STICKY;
  try
    PostToast('服务启动了');
    if Intent <> nil then
    begin
      AVal := Intent.getStringExtra(StringToJString('AutoRunApp'));
      if Assigned(AVal) then
      begin
        PostToast('收到启动 APP 命令');
        AndroidServiceStratApp('AutoRunApp');
      end;
    end;


    if Intent <> nil then
    begin
      AVal := Intent.getStringExtra(StringToJString('BOOT_COMPLETED'));
      if Assigned(AVal) then
      begin
        PostToast('一会 APP 会自动启动。');
        AndroidServiceStratApp('BOOT_COMPLETED');
      end;
    end;

    //这边可以添加开机自动启动的其他代码。

  finally
    PostToast('服务运行完毕');
  end;

end;[/mw_shl_code]

作者: wang_80919    时间: 2016-12-4 18:01
以上代码。
负责完成 开机启动 APP
定时 启动 APP 。

但是想要正常完成 开机启动 APP,需要配置 XML。然后手机的安全软件要设置你的  APP 允许开机运行。否则无效。

配置了 XML,只是一部分。
你还得编译 Java 代码为 JAR,然后加入到你的 APP 中。
这些在我们群已经是烂大街的技术了。

作者: wang_80919    时间: 2016-12-4 18:02
下面是 XML 的配置。

注意 action  的不同。

[mw_shl_code=javascript,true]        <!-- add by flying wang -->
        <receiver android:name="com.delphi.flying.BootReceiver"
          android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
          <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED" />
          <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
        </receiver>

       <receiver android:name="com.delphi.flying.CommonReceiver">
           <intent-filter>
               <action android:name="android.intent.action.USER_PRESENT" />
           </intent-filter>
        </receiver>

        <receiver
            android:name="com.delphi.flying.CommonReceiver"
            android:permission="android.permission.CHANGE_NETWORK_STATE">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>

        <receiver
            android:name="com.delphi.flying.CommonReceiver"
            android:permission="android.permission.CHANGE_WIFI_STATE">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>

        <receiver
            android:name="com.delphi.flying.CommonReceiver"
            android:permission="android.permission.CHANGE_WIFI_MULTICAST_STATE">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>

[/mw_shl_code]


作者: wang_80919    时间: 2016-12-4 18:03
我写 XE5 自启动,参考的是 Brian Long 写的英文文章。

2014年8月,成功实现自启动。

2014年 11月份 XE7 版本只是写成了中文的 WORD 文档。同时支持 jar 了。再也不用傻逼似的合并 DEX 了。

到了 RAD10,安卓可以写 服务 了。
2015 年 9月份 就改成 不直接启动 APP,先启动服务。
服务来做具体的任务。

在我们群,很多人都收到了相关代码。

但是 开机启动 APP 或服务,依然受到手机内置安全程序的控制。
所以,实际意义不大。

真正有意义的,是大家可以写 服务了。
服务 可以通过配置 XML 实现 WIFI 或 3G 网络变化就启动。
APP 启动,服务也启动。
服务定时启动服务。
例如 每隔 5 分钟 启动一次服务。

服务启动后,切记,不能长时间运行,顶多 几分钟,一般几秒钟即可,当然用于音频播放的服务可以做到长期运行。
不过,有一些白痴,不相信我。你们爱咋咋地吧。

另外再说一个,如果你用 定时的方法让 安卓显示消息,那么请给 APP 震动的权限,否则部分手机会提示 你的 应用 已经 结束或退出了。也就是 闪退了。



手机从休眠中恢复,会先联网。
开机之后也会联网。
配置 XML 接收 网络变化消息。
用这个消息 启动 服务,基本上等同于 开机启动 服务。
你服务启动后,用楼主的 定时器代码 来 定时启动 服务。
这样,服务就能 在 非休眠状态 连续运行了。
休眠之后,就只能看 厂家 ROM 的 脸色了。
但是 从 休眠中 恢复后,肯定会联网的。你的  服务也肯定会继续运行的。
休眠的时候,服务 不运行,也就不是什么问题了。



最近公开了如下旧代码。
安卓服务,自启动,开机运行app 简单教程
http://www.2pascal.com/forum.php ... =2977&fromuid=4
(出处: 2Pascal-新时代的Pascal)

作者: wang_80919    时间: 2016-12-4 18:04
Toast For Android Service 安卓服务专用 Toast 代码
http://2pascal.com/forum.php?mod=viewthread&tid=2616&fromuid=4
(出处: 2Pascal-新时代的Pascal)


关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
http://2pascal.com/forum.php?mod=viewthread&tid=1384&fromuid=4
(出处: 2Pascal-新时代的Pascal)

一种简单的 jar 转 pas 工具,不如 EMB 官方提供的 工具 强大。
JarOrClass2Pas FlyingWang V1.0.2016.426 附赠 java 转 Jar.zip
http://www.2pascal.com/forum.php ... d=891&fromuid=4
(出处: 2Pascal-新时代的Pascal)


如果你希望使用 EMB 官方工具,请打开你的 帮助,搜索 Java2OP.exe 。


作者: ytxiaokang    时间: 2017-10-30 14:12
给一个赞。
作者: abc2000    时间: 2017-10-30 15:18
OKOKOK!!!!!!!!!!!!!!!!!!!!!!!!
作者: bjabc    时间: 2017-10-30 15:39
老猫威武
作者: desei    时间: 2017-10-31 00:23
谢谢!!!!!!!!!!!!!
作者: immd    时间: 2017-10-31 15:06
老猫
作者: wfymqj    时间: 2017-11-6 10:17
谢谢分享
作者: coolwd    时间: 2017-11-15 21:38
支持,一年了
作者: humorsun    时间: 2017-11-17 18:35
这个是什么

作者: tqdyz    时间: 2018-3-5 08:24
谢谢分享!
作者: wangdejun009    时间: 2019-2-2 10:11
谢谢老师分享
作者: 素还真    时间: 2019-3-9 02:33
向老猫学习
作者: wnhoo    时间: 2019-4-13 06:41
不错不错不错不错不错不错不错不错不错不错不错不错
作者: tangnyzl    时间: 2019-5-9 00:47
学习了,谢谢
作者: wjh0494    时间: 2019-6-3 08:24
版主厉害,学习学习。
作者: 先来一铜大铲    时间: 2020-3-2 01:59
2020-3-2 10:01:43  
偷偷的学习下




欢迎光临 2Pascal-新时代的Pascal (http://2pascal.com/) Powered by Discuz! X3