小编Ale*_*lex的帖子

Android持久套接字连接规则

我一直在使用持久套接字对Android设备的自定义推送通知解决方案进行一些测试.我想分享我的发现并验证结果.

简单描述
应用程序运行前台服务并与服务器建立连接,并通过积极的ping(@ 10秒间隔)维护该连接.如果连接被检测为死机,则应用程序会不断尝试重新连接.服务器通过双工通道发送通知.

测试1:

Pinging is done using a timer at 10 second intervals.
Server sends notification every minute.
Applications acquires wifi and wake locks.
Duration : 8 hours
Battery loss : ~14%
Run Code Online (Sandbox Code Playgroud)

测试2:

Pinging is done using AlarmManager at 10 second intervals.
Server sends notification every minute.
Application acquires only a wifilock
Duration : 8 hours
Battery loss : ~7%
Run Code Online (Sandbox Code Playgroud)

假设:传入的网络数据包会自动唤醒CPU,因此无需唤醒锁定.使用AlarmManager ping(而不是计时器)意味着我们不需要唤醒锁.

取下那个唤醒锁似乎真的有助于电池.令人惊讶的是,对任何一种解决方案的激烈攻击并没有像我预期的那样影响电池寿命.(我们进行了许多其他测试,包括一个应用程序只是持有一个wifilock并且没有做任何导致同期电池损失约4%到5%的测试)

由于应用程序能够成功发送所有ping请求并接收所有传入消息,我相信我的假设是正确的.但我很乐意得到任何专家的确认.

还有一个问题: 如果应用程序要监听传入的连接.在这种情况下我需要拿一个唤醒锁,对吗?传入连接不会唤醒CPU?我们不是沿着这条路走下去,而是想确认一下.

此外,请不要推荐GCM,它已被公司政策排除.

谢谢.

sockets android tcp wakelock batterylevel

37
推荐指数
1
解决办法
8198
查看次数

Google Play 管理中心 - 通过托管发布仅发布某些更改

我有一个已通过 Google 审核并准备发布的应用程序。托管发布已打开。然而,我还没有准备好向公众发布它。与此同时,我想将一个新版本添加到封闭的测试轨道中。问题是,当我添加新的测试版本时,它也会进入“准备发布的更改”列表。我看到“发布更改”的常规按钮,但没有看到发布某些更改的方法。

我怎样才能发布我的测试版本而不同时发布生产应用程序?如果我现在关闭托管发布,它会自动发布所有当前待处理的更改吗?

android publish google-play-console

37
推荐指数
1
解决办法
3254
查看次数

添加摘要通知后,Android组通知不会报警(Android 6.0)

我想让本地通知像Hangouts一样工作.我希望每次收到新的短信时都会出现抬头通知.但是当有两个或更多未读通知时,我想在Android通知栏中显示摘要通知.这似乎是通过团体堆叠通知,并加入一组摘要应描述工作在这里.下面的代码似乎适用于Android 5.0和5.1,但在Android 6.0上,当存在该组的摘要通知时,本地通知不会在抬头视图中报警/显示.因此,仅显示初始通知.

public class MainActivity extends AppCompatActivity {

private Button _button = null;
final static String GROUP_KEY_EMAILS = "group_key_emails";
private int messageNum = 1;

private void CreateNotification() {
    // Build the notification, setting the group appropriately
    Notification headsUpNotification = new NotificationCompat.Builder(this)
            .setContentTitle("Title")
            .setContentText("New Message" + messageNum)
            .setSmallIcon(R.drawable.pngreceivedtextmessage)
            .setGroup(GROUP_KEY_EMAILS)
            .setPriority(Notification.PRIORITY_HIGH)
            .setDefaults(Notification.DEFAULT_ALL)
            .build();

    // Issue the notification
    NotificationManagerCompat notificationManager =
            NotificationManagerCompat.from(this);
    notificationManager.notify(messageNum, headsUpNotification);

    Bitmap largeIcon = BitmapFactory.decodeResource(getResources(),
            R.drawable.pngreceivedmessageicon);

    if(messageNum > 1) {
        // Create a summary notification since we …
Run Code Online (Sandbox Code Playgroud)

android android-notifications android-6.0-marshmallow

7
推荐指数
1
解决办法
763
查看次数

MonoDroid和MonoTouch的共享库

所以我的公司来自一个完全C#.Net的环境,所以很自然地我们正在寻找Mono用于移动开发.我们有一个非常广泛的Windows平台库,我可以将其作为Android类库移植.我的想法是这个Android类库将成为我们的移动平台库,可以在未来重用MonoTouch(尚未经过测试,但只要没有Android特定代码,就可以读到MonoTouch项目可以引用Android类库).但是在库中,有很多日志语句,对于Windows环境来说,最终只是跟踪语句(包含在自定义助手类中).我们希望保留日志记录语句并基于当前环境(iOS或Android),只需将其转换为本机日志记录.

我计划在移动平台库中使用部分声明进行日志记录,并让Android和iOS特定库包含这些部分日志记录方法的实现.但是当我意识到部分在部件之间不起作用时,这种情况就崩溃了.

所以现在我不知道该怎么做.如果有两个独立的iOS和Android平台库并链接相同的文件,我唯一能想到的就是.(Xamarin可能有一个日志类来执行此操作,但我们仍需要为任何其他未来的抽象提出模式)

任何建议表示赞赏.我们仍处于试验/规划阶段,因此我们可能会忽略某些事情,如果是这种情况,请告诉我们.

谢谢.

编辑
让我们说我有以下简单的静态类.

public static class TraceHelper
{
    public static void WriteLine(string message)
    {
        // Validation and preprocessing
        Trace.WriteLine(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在移动平台库中有数百个调用此方法的方法.现在让我说我在我的Android应用程序中引用这个库,有没有办法在不修改库本身的情况下覆盖TraceHelper.WriteLine()的实现?

更新
我们最终创建了实现缺少的.NET功能的Android和iOS库.只需将本机等效功能包装在同一个.NET命名空间和类中.EX:

using Android.Util;

namespace System.Diagnostics
{
    public static class Trace
    {
        #region Non-Public Data Members

        private const string Tag = "Trace";

        #endregion

        public static void WriteLine(string message)
        {
            Log.WriteLine(LogPriority.Verbose, Tag, message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# shared-libraries xamarin.ios xamarin.android xamarin

5
推荐指数
1
解决办法
927
查看次数

Flutter - 在 CustomPainter 中重用以前绘制的画布

我有一个 CustomPainter,我想每隔几毫秒渲染一些项目。但我只想渲染自上次绘制以来发生变化的项目。我计划手动清除将在该区域内更改和重绘的区域。问题是每次调用paint() 时,Flutter 中的画布似乎都是全新的。我知道我可以跟踪整个状态并每次都重绘所有内容,但出于性能原因和特定用例并不可取。以下是可能代表该问题的示例代码:

我知道当画布大小改变时,一切都需要重新绘制。

import 'dart:async';
import 'dart:math';

import 'package:flutter/material.dart';

class CanvasWidget extends StatefulWidget {
  CanvasWidget({Key key}) : super(key: key);

  @override
  _CanvasWidgetState createState() => _CanvasWidgetState();
}

class _CanvasWidgetState extends State<CanvasWidget> {
  final _repaint = ValueNotifier<int>(0);
  TestingPainter _wavePainter;

  @override
  void initState() {
    _wavePainter = TestingPainter(repaint: _repaint);
    Timer.periodic( Duration(milliseconds: 50), (Timer timer) {
      _repaint.value++;
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
       painter: _wavePainter,
    );
  }
}

class TestingPainter extends CustomPainter {
  static const double _numberPixelsToDraw = 3;
  final …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-canvas

4
推荐指数
1
解决办法
1000
查看次数

重定向cmd.exe的输入/输出

我在使用进程的重定向输入/输出时遇到了一些麻烦.最初,我有两个通过tcp/ip进行通信的应用程序.服务器告诉客户端打开cmd.exe,然后向客户端发出命令,客户端必须重定向到cmd.exe进程.然后客户端读取输出并将其发送回服务器.基本上我正在创建一种远程使用命令行的方法.

问题是它适用于第一个命令,然后没有任何事情.我能够在不使用tcp/ip的情况下重新创建问题.

Process p = new Process();
ProcessStartInfo psI = new ProcessStartInfo("cmd");
psI.UseShellExecute = false;
psI.RedirectStandardInput = true;
psI.RedirectStandardOutput = true;
psI.CreateNoWindow = true;
p.StartInfo = psI;
p.Start();
p.StandardInput.AutoFlush = true;
p.StandardInput.WriteLine("dir");
char[] buffer = new char[10000];
int read = 0;
// Wait for process to write to output stream
Thread.Sleep(500);
while (p.StandardOutput.Peek() > 0)
{
    read += p.StandardOutput.Read(buffer, read, 10000);
}
Console.WriteLine(new string(buffer).Remove(read));

Console.WriteLine("--- Second Output ---");
p.StandardInput.WriteLine("dir");
buffer = new char[10000];
read = 0;
Thread.Sleep(500);
while (p.StandardOutput.Peek() > …
Run Code Online (Sandbox Code Playgroud)

c# outputstream

3
推荐指数
1
解决办法
1万
查看次数