在 Android 10 中,对应用应用了新的限制。我们不能再从后台开始活动。虽然这对大多数应用程序来说可能没问题,但对于需要在推送通知到达后显示来电的 voip 应用程序来说,这是一个致命的打击。
根据这个https://developer.android.com/guide/components/activities/background-starts有一个条件列表可以满足仍然允许打开活动,但我不完全理解(非这里是英语母语)。
我绝对知道的是:
我没有任何正在运行的活动、任务、后台堆栈等
该应用程序甚至没有运行
我需要达到的目标:
我该怎么做才能在 android 10 中为传入的 voip 呼叫打开一个活动?在锁屏上,就像普通用户对 PHONE 应用程序的期望一样。
提前感谢您的任何提示。
我在库中使用@Retention和@StringDef注释我的一些方法,我面临一个奇怪的警告,我想了解.
在静态类中SIP,我使用此注释:
public static final String CODEC_SPEEX_16K = "speex/16000/1";
public static final String CODEC_SPEEX_8K = "speex/8000/1";
public static final String CODEC_SPEEX_32K = "speex/32000/1";
public static final String CODEC_ILBC_8K = "iLBC/8000/1";
public static final String CODEC_GSM_8K = "GSM/8000/1";
public static final String CODEC_PCMU_8K = "PCMU/8000/1";
public static final String CODEC_PCMA_8K = "PCMA/8000/1";
public static final String CODEC_G722_16K = "G722/16000/1";
@Retention(RetentionPolicy.CLASS)
@StringDef({
CODEC_SPEEX_16K,
CODEC_SPEEX_8K,
CODEC_SPEEX_32K,
CODEC_ILBC_8K,
CODEC_GSM_8K,
CODEC_PCMU_8K,
CODEC_PCMA_8K,
CODEC_G722_16K
})
public @interface CodecName {}
Run Code Online (Sandbox Code Playgroud)
编译很好,没有任何警告. …
Android Api 29 在文件和文件夹方面有很大的变化。到目前为止,我还没有找到在内部存储中创建一个公共可见文件夹的方法。我创建的每个文件夹只能被我的应用程序看到。
我编写了一个应用程序,它创建的数据文件应由其他应用程序接收,例如 Total Commander 将它们复制到目的地。一切正常,直到我激活 Api 29。我的一些客户确实使用像素手机,他们使用 Android 10。
如何在 Android 10 中创建公开的文件夹和文件?
这已被弃用:
Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(type);
Run Code Online (Sandbox Code Playgroud)
当我使用
File root = context.getExternalFilesDir(null);
Run Code Online (Sandbox Code Playgroud)
创建的文件只能被我的应用程序看到。如何实现在 Android 10 之前有效的行为?
提前致谢。
我仍处于Java的学习曲线上.为了理解更多初始化块,我创建了一个小测试类:
public class Script {
{
Gadgets.log("anonymous 1");
}
public Script() {
Gadgets.log("constructor");
}
{
Gadgets.log("anonymous 2");
}
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个实例时,我得到这个日志:
Script: anonymous 1
Script: anonymous 2
Script: constructor
Run Code Online (Sandbox Code Playgroud)
这告诉我,两个初始化程序块都在构造函数之前按照它们在源代码中出现的顺序运行(与静态初始化程序相同).我想知道的是:我对这种行为有更多的控制吗?因为Java Documentation说(来源):
实例变量的初始化程序块看起来就像静态初始化程序块,但没有static关键字:
{
// whatever code is needed for initialization goes here
}
Run Code Online (Sandbox Code Playgroud)
Java编译器将初始化程序块复制到每个构造函数中.因此,该方法可用于在多个构造函数之间共享代码块.
那么"将初始化程序块复制到每个构造函数中"究竟是什么意思呢?根据我的日志,看起来,它们是在每个构造函数的开头复制的.这是正确的吗?
如果将它们复制到每个构造函数的END(这是我在匿名2中所期望的那样),那么在多个构造函数之间共享这些块也会非常有意义.有没有办法控制这些块多一点,或者我唯一的选择是编写一个在每个构造函数中调用的命名方法的"经典"方法,如果我想在每个构造函数的末尾执行常见任务?
我们在 SIP 应用中使用 Firebase,以便在应用离线时向我们发送未接来电通知和聊天通知。
虽然发送和接收工作正常,但我们对 Android 客户端有影响,即 5 个未接来电 obv 会生成 5 个未接来电通知,填满客户端设备上的通知栏。
我们如何将这些通知合并在一起,只显示一个“5 个未接来电”通知?
我们是否可以在消息data或notification消息的一部分中放置任何其他标志(例如分组)?
以下是我们当前的未接来电通知的示例:
{
"to":"<<FCMToken>>",
"priority":"high",
"notification":{
"title":"<<Displayname-of-Caller>>",
"text":"<<Date-and-time-of-call>>",
"icon":"icon_notification_missed",
"click_action":"MISSED_CALL"
},
"data":{
"type":"sip-call-missed"
}
}
Run Code Online (Sandbox Code Playgroud)
那么将它们结合在一起有什么技巧呢?
我有一个抽象类,在继承时需要重写3个方法.但是我还有另外一种方法可以封存,所以它不会被覆盖.它包含整个类工作的重要逻辑,我想避免用户通过在他/她不应该的地方执行覆盖来杀死功能.
有没有办法实现这个目标?或者至少是一种向用户发出信号的方式"不要那样做!"?
你会如何处理这样的要求?欢迎任何建议!干杯
/编辑它是覆盖和重载之间的区别,感谢您的评论!