app开发公共列表组件要注意哪些事项?

在移动应用开发中,列表组件是非常重要的UI控件之一。很多应用需要显示一些简单的数据列表,例如商品列表、新闻列表、用户列表等等。为了提高开发效率,许多框架和库都提供了列表组件,开发者可以直接使用,从

而避免在造轮子上浪费时间。在本文中,我们将探讨如何开发一个公共的列表组件,以便于快速构建各种应用。

**组件需求**

在设计列表组件之前,我们需要明确组件的需求。我们期望我们的列表组件应该具备以下功能:

1. 可以滚动,支持下拉刷新和上拉加载更多

2. 列表数据可以动态更新,例如在列表末尾追加新数据或者删除旧数据

3. 支持不同样式的列表项,例如带有图片的新闻列表项、仅有标题的任务列表项、包含状态的订单列表项等等

4. 支持点击列表项进入详情页

我们定义了上述基本要求,但不同的应用场景可能还会有其他的特殊需求,例如侧滑菜单、多语言支持等等。在开始开发列表组件之前,我们需要确保我们所构建的组件尽量通用以便于适用于广泛的应用场景。

**实现方法**

1. 列表容器

我们首先定义一个列表容器组件,在这个组件里我们定义了一个基本的滚动容器、一个下拉刷新控件和一个上拉加载更多控件,在容器组件中我们把这些组件组合起来成为一个可以滚动的列表。可以使用第三方库提供的ScrollView组件或者FlatList组件,这些组件已经封装了滚动操作的相关逻辑。

“`javascript

import React, {Component} from ‘react’;

import {

ScrollView,

RefreshControl,

FlatList,

View,

} from ‘react-native’;

class ListContainer extends Component {

constructor(props) {

super(props);

this.state = {

data: [],

refreshing: false,

loadingMore: false,

loadMoreError: false

};

}

render() {

return (

refreshControl={

refreshing={this.state.refreshing}

onRefresh={this._onRefresh.bind(this)}

/>

}

onScroll={this.props.onScroll}

>

data={this.state.data}

ListHeaderComponent={this.props.renderHeader}

renderItem={this.props.renderRow}

keyExtractor={this.props.keyExtractor}

onEndReached={this._onEndReached.bind(this)}

onEndReachedThreshold={0.1}

ListFooterComponent={this._renderFooter.bind(this)}

/>

);

}

_onRefresh() {

// 刷新列表

}

_onEndReached() {

// 加载更多数据

}

_renderFooter() {

// 渲染上拉加载更多组件

}

}

export default ListContainer;

“`

2. 列表项

我们将列表项作为一个单独的组件进行开发,以便于在不同的应用场景中进行重用。列表项需要支持动态数据更新,我们可以通过定义组件的props来实现这个功能。同时,我们需要传入一个click事件处理器用于实现列表项的点击事件。

“`javascript

import React, {Component} from ‘react’;

import PropTypes from ‘prop-types’;

import {

View,

Text,

Image,

TouchableOpacity,

} from ‘react-native’;

class ListItem extends Component {

static propTypes = {

data: PropTypes.object.isRequired,

onClick: PropTypes.func.isRequired,

};

constructor(props) {

super(props);

}

render() {

let data = this.props.data;

return (

this.props.onClick(data)}>

{this.props.renderImage && this.props.renderImage(data)}

{this.props.renderTitle && this.props.renderTitle(data)}

{this.props.renderSubTitle && this.props.renderSubTitle(data)}

{this.props.renderExtra && this.props.renderExtra(data)}

);

}

}

export default ListItem;

“`

在上述代码中,我们为ListItem组件设定了propTypes,用于传递数据对象和点击事件。在渲染过程中,我们可以调用传入的函数来渲染任何组合的子组件,例如图片、标题、副标题、附带信息等等。这意味着我们可以根据应用场景来决定如何渲染不同的内容。另外,要特别注意TouchableOpacity组件,它用于实现响应点击事件的操作。

3. 下拉刷新控件

下拉刷新控件是一个很重要的UI控件,我们需要为其定制一个非常好看且具有良好交互性的控件。一个常见的下拉刷新控件应该包含以下特性:

– 视图:当下拉刷新状态时,应该呈现一个动画和提示文字

– 状态转换:当松开拉手时,刷新状态应该自动开始

– 状态提示:当正在刷新时,下拉刷新控件应该显示一个进度条

“`javascript

import React, {Component} from ‘react’;

import {

ActivityIndicator,

View,

Text,

StyleSheet,

} from ‘react-native’;

class CustomRefreshControl extends Component {

render() {

let refreshing = this.proAPP开发ps.refreshing;

return (

{refreshing ? (

正在刷新…

) : (

下拉刷新

)}

);

}

}

const styles = StyleSheet.create({

refresh: {

height: 36,

justifyContent: ‘center’,

alignItems: ‘center’,APP

backgroundColor: ‘#1890ff’,

},

refreshLoading: {

marginBottom: 6,

},

refreshText: {

fontSize: 14,

color: ‘#fff’,

},

});

export default CustomRefreshControl;

“`

4. 上拉加载更多控件

上拉加载更多控件的实现与下拉刷新控件非常相似,它应该包括一个加载中的状态提示,以及一个没有更多数据的提示。我们可以通过判断当前数据是否还有更多数据来使组件处于不同的状态。

“`javascript

import React, {Component} from ‘react’;

import {

ActivityIndicator,

View,

Text,

StyleSheet,

} from ‘react-native’;

const LoadMoreStatus = {

loading: 1,

noMoreData: 2,

error: 3,

};

class LoadMoreControl extends Component {

constructor(props) {

super(props);

this.state = {

status: LoadMoreStatus.loading,

};

}

render() {

return (

{this._renderFooter()}

);

}

updateStatus(status) {

this.setState({status});

}

_renderFooter() {

switch (this.state.status) {

case LoadMoreStatus.loading:

return (

加载中…

);

case LoadMoreStatus.noMoreData:

return (

没有更多了

);

case LoadMoreStatus.error:

return (

加载失败,点击重试

);

default:

return null;

}

}

}

const styles = StyleSheet.create({

footer: {

height: 60,

flexDirection: ‘row’,

justifyContent: ‘center’,

alignItems: ‘center’,

},

footerLoading: {

marginRight: 5,

marginBottom: -2,

},

footerText: {

fontSize: 14,

color: ‘#999’,

}

});

export default LoadMoreControl;

“`

5. 总结

本文我们实现了一个公共的列表组件,它具备了基本的下拉刷新、上拉加载更多功能,以及可配置性高的列表项。我们可以根据实际需求,对组件的代码进行修改进行适配。总体来说,一个好的列表组件应该具备如下特点:

– 可定制性高:允许开发者渲染任意复杂的列表项,以适应各种应用场景。

– 逻辑简单:尽量避免多余的逻辑,让列表组件更加优雅。

– 功能强大:支持一些常见的UI控件,例如下拉刷新、上拉加载更多、侧滑菜单等。

– 良好的用户体验:对UI进行美化,以提高用户体验和吸引用户的注意力。

app开发公司100强怎么选?

随着移动互联网的发展,越来越多的企业关注于开发自己的应用程序(App),以扩展自己的业务和抢占市场份额。作为App开发公司,不仅需要懂得技术,还需要精通市场趋势和用户需求,才能够顺应市场变化,开发满足用户需求的优质应用程序。在这篇文章中,我们将会介绍app开发公司100强,探讨它们成功的背后原因。

一、 什么是app开发公司100强?

app开发公司100强是由全球移动应用开发公司及部分求职者参与投票所产生的排行榜。它综合了许多因素,包括企业绩效、专业技术、客户服务、市场占有率等,来评定每个公司在当前市场上的排名。这份排行榜不仅有助于了解业内竞争力以及市场趋势,也为求职者提供了一个了解这些优秀的公司以便做出正确选择的机会。

二、app开发公司100强的特点

1. 具备丰富的经验与技术能力

app开发公司100强在技术实力方面十分优异,能够为客户提供最新的技术解决方案。其中一些公司有着多年的经验积累,并与其它领域能力强版块建立了稳定的合作关系。这个优势有助于它们在开发过程中避免重蹈覆辙,有效降低开发周期和维护成本,并且能够满足客户不同需求的要求。

2. 多元化业务类型和覆盖面广

app开发公司100强广泛涉及到许多不同的行业和领域,包括电商,金融,游戏、社交等等。具有一定规模的公司一般会有能

力设法突破其行业和市场范畴的限制,在众多领域形成自己的核心竞争力,才能快速扩大市场占有率。

3. 具备不同的市场定位和战略

app开发公司100强在市场方面十分灵活。有些公司专注于自主开发自有的App产品,并寻求其中倍增长;有些则致力于提供优质高效的生产服务;还有一些公司注重客户体验,像奇虎360就非常注重App的用户体验,有明确的设计理念和专业设计团队。这些app开发公司的市场定位和战略相对灵活,能够迅速应变以及满足客户的需求,APP因此才能在市场竞争中处于优势位置。

三、 app开发公司100强的成功之路

1. 技术

作为app开发公司,拥有成熟的技术和优秀的技术团队至关重要。app开发公司100强的技术开发能力强,能够在满足客户需求的同时保证应用程序的品质和稳定性,进而提升客户满意度以及公司口碑。

2. 产品

优秀的产品是公司成功的核心,也是app开发公司100强的独特之处。这些公司有着自己的产品开发团队,并在开发过程中采用用户中心的设计理念,以确保产品是适合市场,符合用户需求的。

3. 市场营销

app开发公司100强之所以成功,除了由于技术和产品的优势外,还与它们的市场营销策略有着一定的关系。有些公司采用广告宣传的方式占领市场份额,还有一些公司则采取口碑营销逐渐赢得用户信任,而另外一些公司则采取合作共赢的方式,将合作伙伴发展并成为方案推广渠道。

四、未来的发展趋势

app开发公司100强APP开发的持续成功离不开不断的创新,从革新应用程序、完善技术开发流程,到使用新工具和方法,这些公司必须跟上技术进步快速的变化步伐。急需满足市场需求的反向开发、跨平台技术和app移动安全是未来的一个发展趋势,这些因素都将对app开发公司迅速成长和发展起到重要的作用。

总之,app开发公司是目前移动互联网领域的重要力量,而app开发公司100强排行榜的诞生充分展示了其在市场中的表现。这些优秀的公司在技术、产品和市场营销等方面具备优势,并一直在努力创新和进步,以适应不断变化的市场需求。随着移动设备用户数量的不断增长,app开发公司的市场前景将越来越广阔,因此这个行业将会吸引越来越多的公司进入。

app开发免费和付费的博弈?

移动应用开发市场中,应用程序的付费模式与免费模式一直是备受关注的话题。应用程序可以针对不同的用户需求,进行不同的定价策略。本文将从理论和实践两个方面来讨论app开发的免费和付费的博弈。

理论模型:

免费应用的优势:

1.大众化推广:免费应用的用户数量相对较高,可以免费广告或转化为潜在客户,使得应用程序在市场上产生更大的影响力。

2.可持续盈利:通过其他形式的广告和付费增值服务可以获得一定的收益,为企业带来一定的财务支持。

付费应用的优势:

1.提高应用程序价值:应用程序由付费模式转变为免费模式,用户会感觉应用程序的价值相对降低。而在选择付费模式开发时,用户更倾向APP开发于认为付费应用更加成熟、稳定和安全。

2.直接盈利:在付费模式下,应用

程序开发商可以获得比其他模式更直接的收入。开发商不仅可以直接获得收益,还可以更有计划地规划开发、更新和维护。

实践探讨:

根据专业研究,应用程序在多数情况下采用免费+付费模式更有利。在应用程序初始推出时选择免费模式,通过先进行推广获得大量用户,进而将用户进行优化管理,最终转化为付费用户。以此来缓解移动应用入口和流量的压力,同时也有助于开发商及其他机构通过各种方式进行变现。

这种既有免费又有付费的模式还涉及到其他因素,例如:应用程序的类型、受众、目标及整个生态资源等。以下是该模式的具体运作方式:

1.通过免费模式获得用户,这期间不断优化产品,提高用户留存能力。同时对用户关系、偏好及行为习惯进行深度分析,并完善相应的用户数据分析技术。

APP

2.对用户运用多重方式进行精准标识,例如:精细化的兴趣标签数据、区域数据、使用历史记录、搜索行为等信息。借此提高用户的关注度,并匹配不同的推广营销服务。

3.在积累了大量的用户数据后,可以通过广告和其他营销方式为许多业务或产品进行变现。例如通过发放优惠券、商品折扣、游戏礼物等活动吸引用户购买各种道具和游戏素材等。

总之,无论开发者选择免费或是付费模式,最终都需要根据特定的目标、品牌、产品和外部环境来进行权衡。在实际开发过程中,合理运用适当的营销策略和数据分析技术,才能实现可持续的盈利。

app平台收费开发要怎么办?

APP平台收费开发是指通过第三方平台来开发手机应用程序,并支付一定的费用以获取开发服务。这种APP方式适用于那些没有开发经验或者没有时间和资源进行自主开发的个人或企业。

一、APP平台收费开发的原理

APP平台收费开发的原理是基于第三方平台提供的开发工具和服务。这些平台通常提供了一套完整的开发环境,包括开发工具、测试设备、云存储、推广渠道等,以帮助开发者快速、高效地开发出符合市场需求的应用程序。

具体而言,APP平台收费开发的原理可以总结为以下几点:

1. 注册账号:开发者需要在相应的APP平台上注册账号,并提供相关的个人或企业信息。

2. 设计界面:开发者可以使用平台提供的开发工具,进行应用界面的设计和布局。

3. 编写代码:开发者可以使用平台提供的开发语言和框架,编写应用程序的逻辑代码。

4. 调试测试:开发者可以使用平台提供的测试设备和工具,对应用程序进行调试和测试,确保其稳定性和功能完善。

5. 上线发布:开发者可以通过平台提供的发布渠道,将应用程序上线发布到各大应用商店或市场。

6. 收费模式:开发者可以根据自己的需求选择合适的收费模式,如按下载量、按订阅、按广告点击等方式收费。

二、APP平台收费开发的详细介绍

1. 开发工具:APP平台通常提供了一套易于使用的开发工具,如Android Studio、Xcode等,用于开发者进行

界面设计、代码编写和调试测试等工作。

2. 云存储:APP平台通常提供了云存储服务,开发者可以将应用程序的数据和文件存储在云端,方便用户在不同设备上的访问和同步。

3. 推广渠道:APP平台通常具有广泛的用户群体和推广渠道,开发者可以通过平台提供的推广服务,将应用程序推送给更多的用户。

4. 安全保障:APP平台通常具有一系列的安全保障措施,如应用程序的加密、用户隐私的保护等,以确保应用程序的安全性和用户数据的保密性。

5. 收费模式:APP平台通常支持多种收费模式,开发者可以根据自己的需求选择合适的收费方式。例如,可以选择按下载量收费,即用户下载应用程序时支付一定费用;也可以选择按订阅收费,即用户每月支付一定费用来使用应用程序。

总之,APP平台收费开发为个人和企APP开发业提供了一种快速、高效的应用程序开发方式。通过选择合适的平台和收费模式,开发者可以将自己的创意变成现实,并获得一定的经济回报。

app store 开发者申请步骤有那些?

App Store是由苹果公司主持的应用程序商店,为用户提供iPhone

、iPad、iPod touch等Apple设备上的免费和付费应用程序下载。App Store的出现,让开发者有了一个优秀的平台,能够发布并销售自己的应用程序。

App Store开发者需要考虑的事情从以下三个角度:

1.开发应用程序

首先,App Store开发者需要开发一款高质量的应用程序,满足市场需求。开发应用程序APP的过程中,需要考虑到用户的使用习惯和喜好,精细化应用程序的功能、界面设计等,以便获得市场竞争力。

在App Store中,开发应用程序需要使用苹果公司提供的开发工具,如Xcode、iOS SDK等,这些工具能够帮助开发者快速构建出符合苹果公司规范的应用程序,并提供完善的API和基础框架供开发者使用。

2.遵循规范

苹果公司为了维护App Store平台的品牌和安全,制定了一系列的规范,开发者需要遵守这些规范,才能通过苹果公司的审核。

这些规范包括但不限于:

(1)确保应用程APP开发序的质量;

(2)确保应用程序的内容不违反相关法律法规;

(3)确保应用程序不侵犯第三方知识产权;

(4)确保应用程序的数据安全。

开发者应该将合适的规范融入自己的开发过程中,避免在审核环节遭到苹果公司的“拒绝入驻”。

3.上架程序

开发者需要预先准备好程序相关的各项资料,如软件介绍、截图等等。然后通过苹果公司提供的开发者中心提交应用程序和资料,进行审核和上架。

苹果公司在审核过程中会仔细审核开发者提交的应用程序,内容和资料。在审核通过后,开发者的应用程序便可以上架到App Store中,供用户下载使用。

总结:

App Store的开发者需要投入足够的时间和精力,构建出高质量的应用程序,并遵循苹果公司的相关规范。成功的应用程序会增加平台的吸引力,提高开发者的知名度和收益。

小米手机设备全局拖拽功能技术适配说明

小米手机设备全局拖拽功能技术适配说明

1.简介

安卓拖拽分享功能提供了一种跨窗口传递数据的功能,文本、图像或任何可以用uri表示的数据都可以通过拖拽从一个窗口传递到另一个窗口。

可参考谷歌官方文档:Drag and drop | Android Developers

app适配拖拽功能主要分为拖出适配拖入适配,本文将分别简介其适配方法。

2.拖出适配

app对任意view调用startDragAndDrop方法即可实现拖出。本章分别对拖出文字、拖出图片、拖出任意文件进行演示。

2.1.拖出文字

使用一个TextView来拖出文字:

// 拖出文字示例
findViewById<TextView>(R.id.drag_text_view).setOnLongClickListener { view -> // 设置长按回调
    val textView = view as TextView
    val clipData = ClipData.newPlainText("label", textView.text) // 构建存放文本的ClipData
    // 调用view.startDragAndDrop方法开始拖拽
    textView.startDragAndDrop(clipData, // 传入clipData
        View.DragShadowBuilder(textView), // 使用textView的draw方法绘制拖拽的图像
        null, // 传入一个本地数据对象
        View.DRAG_FLAG_GLOBAL or View.DRAG_FLAG_GLOBAL_URI_READ) // 加入这些flag允许跨窗口拖拽
    true
}

我们只需要使用ClipData.newPlainText构建一个保存文本的clipData,再调用view.startDragAndDrop方法,将这个clipData作为参数传入,即可实现文字的拖出。

安卓的EditText本身就实现了文字的拖出和拖入,不需要额外适配。

2.2.拖出图片

使用一个ImageView来拖出图片:

// 拖出图片示例
findViewById<ImageView>(R.id.drag_image_view).setOnLongClickListener { imageView -> // 设置长按回调
    val imageUri = getFileUri(R.mipmap.drag_image, "drag_image.png") // 通过fileProvider生成图像文件uri
    val clipData = ClipData("label", arrayOf("image/png"), ClipData.Item(imageUri)) // 使用imageUri构建ClipData
    // 调用view.startDragAndDrop方法开始拖拽
    imageView.startDragAndDrop(clipData, // 传入clipData
        View.DragShadowBuilder(imageView), // 使用imageView的draw方法绘制拖拽的图像
        null, // 传入一个本地数据对象
        View.DRAG_FLAG_GLOBAL or View.DRAG_FLAG_GLOBAL_URI_READ) // 加入这些flag允许跨窗口拖拽
    true // 返回true表示长按事件被处理了
}

其中getFileUri方法将安卓资源中的一张图片作为文件保存到本地,再使用FileProvider得到图片文件的uri,如果对具体实现有兴趣可以阅读源码。最终我们是将uri放入ClipData中,再调用view.startDragAndDrop方法,将这个clipData作为参数传入,即可实现图片的拖出。

2.3.拖出任意文件

任意文件和图片一样,使用一个uri来表示,因此拖出任意文件可以使用和拖出图片类似的方法实现。

使用一个Button来选择任意文件,然后使用一个TextView来显示文件uri并实现文件的拖出:

// 拖出任意文件示例
findViewById<Button>(R.id.choose_file_button).setOnClickListener { chooseFile() } // 选择文件按钮
mDragFileView = findViewById(R.id.drag_file_view)
mDragFileView.setOnLongClickListener { // 设置长按回调
    if (mFileUri != null) { // 选择的文件保存在mFileUri,如果其不为null表示已经选择了一个文件
        val clipData = ClipData.newRawUri("label", mFileUri) // 使用mFileUri构建ClipData
        // 调用view.startDragAndDrop方法开始拖拽
        mDragFileView.startDragAndDrop(
            clipData, // 传入clipData
            View.DragShadowBuilder(mDragFileView), // 使用imageView的draw方法绘制拖拽的图像
            null, // 传入一个本地数据对象
            View.DRAG_FLAG_GLOBAL or View.DRAG_FLAG_GLOBAL_URI_READ) // 加入这些flag允许跨窗口拖拽
    }
    true // 返回true表示长按事件被处理了
}

3.拖入适配

app对任意view注册OnDragListener监听器即可实现拖入处理。本章分别对拖入文字、拖入图片进行演示。

3.1.拖入文字

使用一个TextView来拖入文字:

// 拖入文字示例
findViewById<TextView>(R.id.drop_text_view).setOnDragListener { view, event -> // 设置拖拽监听器
    val textView = view as TextView
    when (event.action) { // 对拖拽不同的事件进行处理
        DragEvent.ACTION_DRAG_STARTED -> {
            val hasText = event.clipDescription.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN) // 查找是否有文字类型的数据
            if (!hasText) { // 没有文字类型的数据
                return@setOnDragListener false // 返回false代表这次拖拽不再继续接收拖拽事件
            }
        }
        DragEvent.ACTION_DROP -> { // ACTION_DROP事件表示拖拽抬手结束的时候
            textView.text = event.clipData.getItemAt(0).text // 将文字设到textView上显示
        }
    }
    true // 返回true代表拖拽事件被处理了
}

我们只需要通过view.setOnDragListener方法注册一个监听器,并在监听器里面处理拖拽事件即可实现拖入。其中在ACTION_DRAG_STARTED事件中对数据类型进行判断,如果不是我们想要的数据类型就返回false即可不再接收本次拖拽事件;最后在ACTION_DROP事件中获取ClipData数据并进行相应的处理。

3.2.拖入图片

使用一个ImageView来拖入文字:

// 拖入图片示例
findViewById<ImageView>(R.id.drop_image_view).setOnDragListener { view, event -> // 设置拖拽监听器
    val imageView = view as ImageView
    when (event.action) { // 对拖拽不同的事件进行处理
        DragEvent.ACTION_DRAG_STARTED -> {
            val mimeTypes = event.clipDescription.filterMimeTypes("image/*") // 查找是否有图像类型的数据
            if (mimeTypes == null) { // 没有图像类型的数据
                return@setOnDragListener false // 返回false代表这次拖拽不再继续接收拖拽事件
            }
        }
        DragEvent.ACTION_DROP -> { // ACTION_DROP事件表示拖拽抬手结束的时候
            requestDragAndDropPermissions(event) // 申请读取uri的权限
            imageView.setImageURI(event.clipData.getItemAt(0).uri) // 将图像uri设到imageView上显示
        }
    }
    true // 返回true代表拖拽事件被处理了
}

与拖入文字不同的地方在于,图片是一个用uri表示的文件,要访问这个uri之前必须调用Activity.requestDragAndDropPermissions方法申请权限。

3.3.拖入任意文件

类似于拖入图片,想要拖入任意文件只需要对拖过来的任意uri进行处理即可,示例代码如下:

// 拖入任意文件示例
view.setOnDragListener { view, event -> // 设置拖拽监听器
    when (event.action) { // 对拖拽不同的事件进行处理
        DragEvent.ACTION_DROP -> { // ACTION_DROP事件表示拖拽抬手结束的时候
            requestDragAndDropPermissions(event) // 申请读取uri的权限
            // 处理uri
        }
    }
    true // 返回true代表拖拽事件被处理了
}

3.4.判断拖入的数据类型

拖入方通常有2种方式判断拖入数据类型。

方法1:可以根据event.clipDescription中的MIMETYPE来判断数据类型

MIMETYPE本身是一个字符串,谷歌对其在ClipDescription.java中有一些预定义:

public class ClipDescription implements Parcelable {
    /**
     * The MIME type for a clip holding plain text.
     */
    public static final String MIMETYPE_TEXT_PLAIN = "text/plain";

    /**
     * The MIME type for a clip holding HTML text.
     */
    public static final String MIMETYPE_TEXT_HTML = "text/html";

    /**
     * The MIME type for a clip holding one or more URIs.  This should be
     * used for URIs that are meaningful to a user (such as an http: URI).
     * It should <em>not</em> be used for a content: URI that references some
     * other piece of data; in that case the MIME type should be the type
     * of the referenced data.
     */
    public static final String MIMETYPE_TEXT_URILIST = "text/uri-list";

    /**
     * The MIME type for a clip holding an Intent.
     */
    public static final String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";

    /**
     * The MIME type for an activity. The ClipData must include intents with required extras
     * {@link #EXTRA_PENDING_INTENT} and {@link Intent#EXTRA_USER}, and an optional
     * {@link #EXTRA_ACTIVITY_OPTIONS}.
     * @hide
     */
    public static final String MIMETYPE_APPLICATION_ACTIVITY = "application/vnd.android.activity";

    /**
     * The MIME type for a shortcut. The ClipData must include intents with required extras
     * {@link Intent#EXTRA_SHORTCUT_ID}, {@link Intent#EXTRA_PACKAGE_NAME} and
     * {@link Intent#EXTRA_USER}, and an optional {@link #EXTRA_ACTIVITY_OPTIONS}.
     * @hide
     */
    public static final String MIMETYPE_APPLICATION_SHORTCUT = "application/vnd.android.shortcut";

    /**
     * The MIME type for a task. The ClipData must include an intent with a required extra
     * {@link Intent#EXTRA_TASK_ID} of the task to launch.
     * @hide
     */
    public static final String MIMETYPE_APPLICATION_TASK = "application/vnd.android.task";

    /**
     * The MIME type for data whose type is otherwise unknown.
     * <p>
     * Per RFC 2046, the "application" media type is to be used for discrete
     * data which do not fit in any of the other categories, and the
     * "octet-stream" subtype is used to indicate that a body contains arbitrary
     * binary data.
     */
    public static final String MIMETYPE_UNKNOWN = "application/octet-stream";
    ......
}

这里面只定义了部分数据,还有其它数据需要app自己定义,目前没有一个准确的规范,通常来说如果是格式为jpg的图像数据则MIMETYPE为”image/jpg”。所以MIMETYPE可以用来初步判定数据类型,但是不完全准确,毕竟MIMETYPE是由拖出方设定的值。

方法2:可以对传入的uri来判断数据类型

我们可以使用ContentResolver的getType方法获取uri的MIMETYPE,然后可以通过MimeTypeMap的getExtensionFromMimeType方法获取文件后缀名。

val mimeType = contentResolver.getType(uri) // 获取MIMETYPE
val extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType) // 获取文件后缀名

通过文件后缀名我们就可以准确判断数据类型。

Android 8.0适配指南

安卓8.0的适配问题主要都是兼容性适配问题,我们在vivo云测平台(VCL)上对一些APP进行了检测,总结出以下三类问题。

一、安装失败 

导致游戏安装失败的原因众多,目前我们检测到的主要是咪咕游戏SDK问题。

▪ 问题描述

此类问题主要是游戏没有集成最新版本的咪咕游戏SDK导致。

▪ 适配建议

目前咪咕游戏SDK最新版本已经兼容安卓8.0版本,建议游戏开发者尽快完成集成适配工作。

二、启动失败 

原因1:应用加壳不兼容

▪ 问题描述

此类问题主要是由于开发者使用了第三方不兼容8.0系统的加固服务导致(360加固、百度加固等)。定位此类问题,一般可在Android 8.0机器上分别安装未加固的应用和加固后的应用,通过应用表现来判定。如果未加固的应用能正常启动,而加固后的应用不能正常启动,则说明加固服务不兼容Android 8.0。

▪ 适配建议

目前360加固已兼容Android 8.0版本。如果开发者要使用加固服务,请咨询加固服务提供商其服务是否兼容Android 8.0版本,如不兼容请取消加固或者使用兼容Android 8.0版本的加固服务。

原因2:联通支付SDK不兼容

▪ 问题描述

主要是APP没有集成最新版本的联通支付SDK导致,也存在其他类型的SDK不兼容8.0系统导致APP启动失败的情况发生。

▪ 适配建议

目前联通支付SDK已经兼容安卓8.0版本,建议开发者尽快完成集成适配工作。APP启动失败时,应考虑检查SDK是否兼容。

原因3:链接了非NDK公开的SO库

▪ 问题描述

主要是应用动态链接了非NDK公开的SO库(如libpixelflinger.so、libcutils.so、libsqlite.so、libcrypto.so、libssl.so等),导致APP在运行中找不到SO而启动失败。

▪ 适配建议

解决此类问题可拷贝非NDK公开的SO库副本到项目中。确保APP在运行时可以找到对应的SO。为避免出现不兼容的问题,开发者应尽量不要使用此类非NDK公开的SO库。

三、运行异常 

目前平台检测出,导致APP运行异常的原因大多集中在腾讯米大师支付SDK问题上。

▪ 问题描述

此类问题主要是由于APP没有集成最新版本的腾讯米大师支付SDK导致。

▪ 适配建议

目前腾讯米大师支付SDK(1.6.6c)已经兼容安卓8.0版本,建议开发者尽快完成集成适配工作。

Android 11应用适配指南

1、如何体验升级Android 11

1.1 vivo机器升级Android 11指导

请开发者更新到市场最新系统版本进行对应调试。

1.2 vivo远程真机调试

vivo云测平台上线了搭载有Android 11开发者预览版的测试机,提供了iQOO3、NEX 3S两款测试机型。vivo开发者云测平台官网链接:vcl.vivo.com.cn

1.3 google原生机升级Android 11

开发者持有Pixel系列的机器可以直接ota升级,或者下载镜像升级,具体见此链接。 

2、Android 11上的主要变更

2.1 兼容性

2.1.1 分区存储

说明:分区存储机制使得应用在外部存储空间能有一块属于自己的专用存储区域,这块区域是私有的,因此,这块区域非常适用于保存用户的私有数据。当然,应用无法访问其他应用的专用存储区域。但如果应用需要将自己专用存储区域的特定文件让其他应用也访问得到,可以通过设置文件分享的方式,去为这些文件做可共享的标记。分区存储将在文件管理、应用程序保护、用户隐私数据保护等方面上有很好的作用。

影响范围:

1) targetSdkVersion为30的应用。

2) targetSdkVersion为29,且未将requestLegacyExternalStorage设为true以停用分区存储的应用。

适配建议:

若您的应用依然使用旧版存储机制,现则需要将数据迁移到与分区存储兼容的目录。

访问文件的位置所需权限访问方法
应用的私有目录无需权限即可访问getExternalFilesDir()
其他应用的私有目录无,但目标文件要被其应用使用FileProvider标记为可共享文件通过ParcelFileDescriptor与FileDescriptor获取
媒体文件目录(音频、照片、视频文件)READ_EXTERNAL_STORAGE(仅当访问其他应用的文件时需要)MediaStore   API
下载目录(文档文件等)无需权限即可访问存储访问框架SAF

分区存储的详细介绍:https://developer.android.google.cn/preview/privacy/storage

2.1.2 单次授权

说明:Android 11开发者预览版本对权限进行了更细颗粒度的划分,引入了“单次授权”的概念。用户可以进行单次授权,让应用获得对用户位置、相机或麦克风的临时性访问权限,如下图所示。在获得本次的授权后,应用可以在以下时间段内获得对应数据的访问:

1) 当应用的Activity可见时。

2) 应用转为后台运行后的一小段时间。

3) Activity可见时启动了一项前台服务,并且随后将应用转到后台,那么应用可以继续访问相关数据,直到该前台服务停止。

影响范围:运行于Android 11上的所有应用。

适配建议:如果您的应用已遵循与权限相关的最佳做法(https://developer.android.google.cn/privacy/best-practices),您无需更改应用即可支持单次授权。

图:应用内的权限申请窗口提供一次性权限选项

2.1.3 后台位置信息访问权限获取方式

说明:当应用申请后台位置信息访问权限时,让用户授予权限的弹窗中,将不再提供“始终允许”的选项,这个选项只存在于设置中的应用权限授予页面,一定程度上能减少应用的“走后门”情况发生,如下图所示,并且后台位置权限的申请需要应用已经拥有前台位置权限。

影响范围:运行于Android 11开发者预览版本上的所有应用

适配建议:若您的应用确定需要获得后台位置信息访问的权限,现在则需要分为两个步骤,因为已无法在没有前台位置信息访问权限的时候直接申请后台位置信息访问权限。

1) 先申请前台位置信息访问权限

2) 再申请后台位置信息访问权限,也就是所谓的“始终允许”,而用户将被引导到设置中进行授予

图:申请后台位置信息访问权限时,应用内的权限申请弹框不再包含“始终允许”

图:后台位置信息访问权限的授予只能在设置中进行

2.1.4 软件包可见性

说明:Android 11开发者预览版本更改了应用查询同一设备上的其他已安装应用的方式,以及与之交互的方式。

影响范围:targetSdkVersion为30的应用

适配建议:应用需要在应用的清单文件中添加<queries>元素,以便系统了解应向其显示哪些其他已安装的应用。如果您的应用执行与其他应用的常见互动,那么您无需更改应用。更多关于Android 11开发者预览版本软件包可见性的信息可参考https://developer.android.google.cn/preview/privacy/package-visibility

2.1.5 新的前台服务类型

说明: Android 11更改了前台服务访问摄像头和麦克风相关数据的方式以进一步保护用户隐私。

影响范围:targetSdkVersion为30的应用

适配建议:您需要在该前台服务声明的foregroundServiceType属性中添加新的camera和microphone类型,否则将无法获取摄像头与麦克风的数据。

2.1.6 自定义视图消息框使用受限

说明:从后台发布的自定义视图消息框将会被系统屏蔽。这类消息框使用setView()为自己定义了一个布局,如图所示。出于安全与用户体验上的考虑,系统屏蔽了从后台发起的自定义视图消息框。但从前台发布的自定义视图消息框依然可以正常生效,且使用Toast.makeText()创建的文本消息框不受影响,在前后台发布均可正常生效。

影响范围:targetSdkVersion为30的应用

适配建议:建议使用信息提示控件(Snackbar)来做代替。

图:Android Q上从后台发布的自定义视图消息框示例

2.1.7 非SDK接口名单更新

说明:Android 11有大量的非SDK接口名单更新,各接口名单更新情况可查询https://developer.android.google.cn/about/versions/11/non-sdk-11。这些变更可能会对一些依赖了非SDK接口的应用带来不同程度的兼容性问题,特别是依赖了Android Q灰名单接口的应用,因为这些接口有一部分已经在Android 11中已归入黑名单中。

影响范围:运行于Android 11上的所有应用。

适配建议:如果您的应用依赖于Android 11的受限接口,您应该开始计划升级SDK并迁移到SDK替代方案。

2.2 新的交互体验和方式

每次Android系统的升级,几乎都会在交互体验上带来一些新变化,此次Android 11也不例外。

例如:

2.2.1 聊天气泡

聊天气泡(chat bubbles)的会话方式正式推出,不再是实验性功能,该特性支持会话窗口最小化为一个或多个悬浮气泡,气泡可以展开为小窗口模式的页面;

图:气泡形式的消息通知

图:气泡展开为会话小窗口

2.2.2 新的输入法键盘过渡动画

借助两个新的API接口——边衬区动画监听器(Insets Animation Listener)与窗口动画控制器(WindowInsets Animation Controller),Android 11为每天都要与我们打交道的输入法键盘带来了新的过渡动画,这些API可让您更轻松地调整应用内容,与IME的出现和消失以及状态和导航栏等其他元素保持同步。这是一个谷歌所提供的示例https://github.com/android/user-interface-samples/tree/master/WindowInsetsAnimation。和当前主流版本中直接从底部弹出的动画相比,新的输入法键盘动画可以跟随我们手指的实际划动逐帧变换,呈现出更加流畅也更加自然的滑入、滑出效果等等。

2.3 硬件层面的新支持

2.3.1 Android 11将更好地支持各类手机屏幕,以提升用户体验

● 瀑布屏:瀑布屏的“瀑布”区域,会带来边缘内容显示失真和误触的情况。在Android 11上,开发者已可以控制“瀑布”区域的交互,现有的DisplayCutout.getSafeInset…()方法现在会返回能够避开瀑布区域以及刘海的安全边衬区。

● 高刷屏:Android 11加入了新的API——Surface.setFrameRate()来允许应用设置自身运行的首选刷新率,以发挥高刷屏的优势获得更好的使用体验,同时也帮助系统在运行应用时智能切换,从系统层面解决高刷新率可能会带来的功耗问题。

2.3.2 Android 11支持并发使用多个摄像头

开发者可以通过新的API以查询对同时使用多个摄像头(包括前置摄像头和后置摄像头)的支持。如需在运行应用的设备上检查支持情况,可以使用以下2个方法,getConcurrentCameraIds()方法可返回摄像头ID的组合,isConcurrentSessionConfigurationSupported()可查询摄像头设备是否可以并发支持相应的会话配置。

2.4 增强5G支持

Android 11 带来了针对5G的“动态计量”和“带宽估算”,更好地发挥5G的高带宽和低延迟特性。灵活地针对不同的场景,不同的网络情况,自适应流媒体质量。

2.5 其他功能

2.5.1 ADB增量APK安装

在设备上安装大型APK可能需要很长的时间。ADB增量APK安装可以安装足够的APK以启动应用,同时在后台流式传输剩余数据,从而加速这一过程。如果设备支持该功能,并且您安装了最新的SDK平台工具,adb install命令将自动使用此功能。或运行此命令adb install –incremental以使用该功能。在运行ADB增量APK安装之前,您必须先为APK签名并创建一个APK签名方案v4文件。且必须将v4签名文件放在APK旁边,才能使此功能正常运行。

2.5.2 应用进程退出原因

Android 11引入了ActivityManager.getHistoricalProcessExitReasons()方法,用于报告近期任何进程终止的原因。应用可以使用此方法收集崩溃诊断信息,例如进程终止是由于ANR、内存问题还是其他原因所致。此外,您还可以使用新的setProcessStateSummary()方法存储自定义状态信息,以便日后进行分析。

2.5.3 动态资源加载器

Android 11引入了两个新API类ResourcesLoader和ResourcesProvider,用来支持应用动态扩展资源的搜索和加载方式。主要的一个用例就是让应用去访问APK外特定目录的资源。

3、参考链接

[1] Android 11中的存储机制更新:https://developer.android.google.cn/preview/privacy/storage

[2] 遵循权限方面的最佳做法:https://developer.android.google.cn/privacy/best-practices

[3] Android 11中的软件包可见性:https://developer.android.google.cn/preview/privacy/package-visibility

[4] Android 11中消息框的更新:https://developer.android.google.cn/guide/topics/ui/notifiers/toasts

[5] 非SDK接口名单更新:https://developer.android.google.cn/about/versions/11/non-sdk-11

[6] 新的输入法键盘过渡动画示例:https://github.com/android/user-interface-samples/tree/master/WindowInsetsAnimation

[7] Android 11中的重大隐私权变更:https://developer.android.google.cn/preview/privacy

[8] Android 11新的功能和API概览:https://developer.android.google.cn/preview/features

vivo Android 13应用适配指南

1. Android 13上的主要变更

1.1 兼容性

1.1.1 使用 JobScheduler 改进预提取作业处理

说明:利用 JobScheduler,应用可使用 JobInfo.Builder.setPrefetch() 将特定作业标记为“预提取”作业,这意味着,理想情况下这些作业应该在应用下一次启动前提前一点运行,以提升用户体验。过去,JobScheduler 仅使用该信号让预提取作业有机会使用免费或多余的数据。

在 Android 13 中,系统现在会尝试确定应用下次启动的时间,并根据该估算值运行预提取作业。应用应尝试使用预提取作业来完成他们想要在下次应用启动前完成的任何工作。

影响范围:运行于Android 13上的所有应用。

1.1.2 停止使用共享用户 ID

说明:如果应用使用已废弃的 android:sharedUserId 属性,并且不再依赖于该属性的功能,可以将 android:sharedUserMaxSdkVersion 属性设置为 32。

这个新属性会告知系统,应用不再依赖于共享用户 ID。如果应用声明 android:sharedUserMaxSdkVersion 并且首次安装在搭载 Android 13 或更高版本的设备上,则应用的行为就像从未定义过 android:sharedUserId 一样,更新后的应用仍会使用现有的共享用户ID。

如果已在清单中定义了 android:sharedUserId 属性,请不要将其移除。这样做会导致应用更新失败。

共享用户 ID 会在软件包管理器中导致具有不确定性的行为。应用应使用适当的通信机制(例如服务和 content provider),在共享组件之间实现互操作性。

影响范围:运行于Android 13上的所有应用。

1.2 用户体验

每次Android系统的升级,几乎都会在交互体验上带来一些变化,此次Android 13也不例外。

1.2.1 前台服务(FGS)任务管理器

无论应用targetSdkVersion为多少,Android 13 都允许用户从抽屉式通知栏中停止前台服务。这项新功能称为前台服务 (FGS) 任务管理器,它会显示当前正在运行前台服务的应用列表。此列表的标签为使用中的应用,每个应用旁边都有一个停止按钮。

1.2.2 放置快捷设置图块API

借助新的图块放置API,应用现在可以提示用户直接将自定义图块添加到通知栏中的快捷设置图块中。借助新的系统对话框,用户只需一步即可不离开应用就添加图块,而不必转到“快捷设置”来添加图块。

1.2.3 按应用设置的语言偏好设置

在许多情况下,多语言用户会将其系统语言设置为某一种语言,但又想为特定应用选择其他语言。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下新功能:

1. 应用可在运行时在界面中设置使用其他语言

2. 用户可在系统设置里为每个应用选择首选语言

1.3 图形、图像和媒体

1.3.1 可编程的着色器

Android 13 添加了对可编程 RuntimeShader 对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果、模糊以及拉伸滚动,并且 Android 13 让您能为应用制作类似的高级效果。

1.3.2 蓝牙低功耗音频

低功耗 (LE) 音频是新一代无线音频,旨在取代传统蓝牙并支持新的使用情形和连接拓扑。通过该技术,用户能够与朋友和家人分享音频内容以及播放音频给他们听,也可以订阅信息、娱乐或无障碍用途的公共广播内容。这项新技术可以确保用户接收到高保真度的音频,而不必牺牲电池续航时间,并且还可以在不同使用情形之间无缝切换,这是传统蓝牙技术无法实现的。

1.4 安全性与隐私

1.4.1 通知运行时权限

说明:Android 13 中引入了新的运行时权限,用于从应用发送非豁免通知:POST_NOTIFICATIONS。

1. 限对话框中可执行以下操作:

 ●  选择“允许”

如果用户选择允许选项,应用可以执行以下操作:

①发送通知。可以使用所有通知渠道。

②发送与前台服务相关的通知。这些通知会显示在抽屉式通知栏中。

 ●  用户选择“不允许”

如果用户选择不允许选项,应用将无法发送通知。除了几个特定情况之外,所有通知渠道都会被屏蔽。这类似于用户在系统设置中手动关闭应用的所有通知后发生的行为。

 ●  用户滑开对话框

滑开对话框(即既没有选择允许,也没有选择不允许),会发生以下行为:

①如果应用符合获得临时通知授权的条件,系统会保留临时授权。

②如果应用没有临时授权,则将无法发送通知。

2. 安装的应用的影响

在搭载 Android 13 的设备上安装应用,应用的通知默认处于关闭状态。在请求新的权限且用户向应用授予该权限之前,应用都将无法发送通知。

权限对话框的显示时间取决于应用的目标 SDK 版本:

 ●  应用targetSdkVersion为33或者更高版本时,应用将可以完全自行控制权限对话框的显示时间。应用可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。

 ●  应用targetSdkVersion低于33时,系统会在应用创建第一个通知渠道时显示权限对话框。这通常是在应用启动时。

3. 对已安装应用的影响

为最大限度地减少与新通知权限相关的中断,系统会自动向系统升级前用户设备上已安装的所有符合条件的应用临时授予新通知权限。此临时授权的持续时间取决于应用的目标 SDK 版本:

 ●  如果应用targetSdkVersion为33或者更高版本时,则临时授权将持续到应用首次启动 activity 为止。

     应用可以完全自行控制权限对话框的显示时间。应用可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。

 ●  如果应用targetSdkVersion低于33时,则临时授权将一直有效,直到用户在通知权限运行时对话框中明确选择一个选项。也就是说,如果用户在未做出选择的情况下关闭了权限提示,系统会保留应用的临时授权。

影响范围:运行于Android 13上的所有应用。

适配建议:

1. 更新应用的目标 SDK 版本。

2. 等待一段时间再显示通知权限提示。等到用户熟悉您的应用之后,再请求他们授予任何权限。新用户可能想要探索您的应用,并切身体会每项通知请求可以带来的好处。

3. 在上下文中请求权限。在应用内请求通知权限时,请在正确的上下文中请求,以便用户明确了解通知的用途以及应该选择接收通知的原因。

4. 检查您的应用能否发送通。用户必须为应用启用通知,应用才能发送通知。要确认用户是否已启用通知,请调用 areNotificationsEnabled()。

5. 以负责任的方式使用权限。获得发送通知的许可后,请负责任地使用该权限。用户可以查看您的应用每天发送的通知数量,并且可以随时撤消该权限。

1.4.2 针对附近 Wi-Fi 设备的新运行时权限

说明:在以前的 Android 版本中,用户需要向应用授予 ACCESS_FINE_LOCATION 权限,应用才能完成与热点相关的多个常见 Wi-Fi 用例、Wi-Fi 直连、Wi-Fi RTT 等。

由于用户很难将位置信息权限与 Wi-Fi 功能相关联,因此 Android 13 在 NEARBY_DEVICES 权限组中引入了新的运行时权限,适用于管理设备与附近 Wi-Fi 接入点连接情况的应用。此权限 (NEARBY_WIFI_DEVICES) 可满足这些 Wi-Fi 用例。

只要应用不会通过 Wi-Fi API 推导物理位置,那么当targetSdkVersion为33或更高版本的应用使用Wi-Fi API时,就可以请求 NEARBY_WIFI_DEVICES 而不是 ACCESS_FINE_LOCATION。

影响范围:targetSdkVersion为33的应用。

1.4.3 在后台使用身体传感器需要新的权限

说明:Android 13 中引入了“在使用时”访问身体传感器(例如心率、体温和血氧饱和度)的概念。如果应用targetSdkVersion为33并且在后台运行时需要访问身体传感器信息,那么除了现有的 BODY_SENSORS 权限外,还必须声明新的 BODY_SENSORS_BACKGROUND 权限。

影响范围:targetSdkVersion为33的应用。

1.4.4 intent 过滤器会屏蔽不匹配的 intent

说明:当应用向targetSdkVersion为33或更高版本的其他应用的导出组件发送 intent 时,仅当该 intent 与接收应用中的 <intent-filter> 元素匹配时,系统才会传送该 intent。系统会屏蔽所有不匹配的 intent,以下情况除外:

 ●  发送给其他应用的未声明任何 intent 过滤器的组件的 intent。

 ●  发送给应用中的其他组件的 intent。

 ●  由系统发送的 intent。

 ●  由具有根级特权的用户发送的 intent。

影响范围:targetSdkVersion为33的应用。

1.4.5 更安全地导出上下文注册的接收器

说明:为了帮助提高运行时接收器的安全性,Android 13 允许指定应用中的特定广播接收器是否应被导出以及是否对设备上的其他应用可见。如果导出广播接收器,其他应用将可以向应用发送不受保护的广播。

在以前的 Android 版本中,设备上的任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。要实现此安全增强措施,请执行以下操作:

 ●  启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改。

 ●  在应用的每个广播接收器中,明确指明其他应用是否可以向其发送广播。

注意:如果启用了 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改,则必须为每个广播接收器指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。否则,当注册广播接收器时,系统会抛出 SecurityException。

影响范围:targetSdkVersion为33的应用。

1.4.6 可主动降级的权限

说明:从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可以帮助应用保护用户的隐私。如需撤消特定运行时权限,请将该权限的名称传入 revokeOwnPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入 revokeOwnPermissionsOnKill()。撤消是异步发生的,会终止与应用的 UID 相关联的所有进程。

系统只有在安全的情况下才会触发撤消操作。当有应用组件仍在前台运行,或者有另一个应用正在访问应用的组件时,不会发生撤消。如果想立即撤消权限,可以调用 exit()。但是,对 exit() 进行此类调用可能会导致当前正在访问应用的其他应用出现未定义的行为或崩溃。

1.4.7 使用精确闹钟的新权限

说明:应用可以使用自动授予应用的 USE_EXACT_ALARM 权限。不过,应用若要使用此权限,必须至少满足以下条件之一:

1.应用是闹钟应用或计时器应用。

2.应用是日历应用,可显示即将进行的活动的通知。

即将推出的 Google Play 政策会阻止应用使用 USE_EXACT_ALARM 权限,除非应用满足前面列表中显示的任一情况。

影响范围:targetSdkVersion为33的应用。

1.4.8 精细媒体权限

说明:如果应用以 Android 13 为目标平台,则必须请求一项或多项新权限,而不是 READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE 权限。

请求的权限集取决于您的应用需要访问的媒体类型:

媒体类型请求许可
图片和照片READ_MEDIA_IMAGES
视频READ_MEDIA_VIDEO
音频文件READ_MEDIA_AUDIO

如果用户之前授予应用READ_EXTERNAL_STORAGE权限,系统会自动将每个新权限授予您的应用。否则,当应用请求上表中显示的任何权限时,系统会显示一个面向用户的对话框。在下图 中,应用程序请求READ_MEDIA_AUDIO权限。如果同时请求 READ_MEDIA_IMAGES权限和READ_MEDIA_VIDEO权限,则只会出现一个系统权限对话框。

2. 参考链接

[1]Android 13开发者预览版:https://developer.android.com/about/versions/13/overview

vivo Android 13 开发者体验版

1、计划概览

欢迎加入vivo Android 13 开发者体验版,此计划将给开发者提供适配 Android 13系统的体验。

注:vivo Android 13 开发者体验版本仅面向开发者,极客用户,对于普通用户,我们强烈建议不要使用。

● 硬件和系统

开发者体验版本可以在iQOO 10、iQOO 10 Pro、X80 Pro设备系统上运行并体验。

● 开发和测试

如果您在vivo Android 13 开发者体验版本进行开发和测试工作, 您将可以针对新的软件变更测试您的应用,请参阅迁移指南,了解让应用与新平台兼容的简单步骤。更多详细的Android 13 相关的介绍,点击这里

感谢您加入vivo Android 13 开发者体验版!

2、获取vivo Android 13 开发者体验版

您可以通过如下方式下载使用iQOO 10、iQOO 10 Pro、X80 Pro设备的软件包固件,然后升级测试自己的应用。

注意:为避免在vivo设备上安装开发者体验版出现异常,升级前请务必先备份数据。

2.1 下载Android 13 开发者体验版

如下升级包下载链接:

设备下载链接MD5校验值
iQOO 10PD2217_A_13.1.7.10.W10.V000L1-update-full.zipd60e54b4ab3d3562f1a15f11d800f2c7
iQOO 10 ProPD2217_A_13.1.7.10.W10.V000L1-update-full.zipd60e54b4ab3d3562f1a15f11d800f2c7
X80 ProPD2185_A_13.0.12.6.W10.V000L1-update-full.zip594caad95190b4454b3237359186df26

2.2 升级Android 13 开发者体验版

您可以将下载到的开发者体验版本软件包固件,按照以下步骤,烧写到对应的vivo设备。手动烧写固件的步骤以X80 Pro为例,具体如下:

(1)下载X80 Pro开发者体验版本软件包固件。

(2)设备连接电脑后将手机USB设置切换到文件传输模式,将已下载好的软件包固件拷贝到X80 Pro手机存储根目录。

(3)按照以上步骤,在设置->系统升级->本地升级中点击升级包,待校验完成后开始升级。

(4)等待手机自动升级完成。

2.3 回退Android 13 开发者体验版

如果您已经手动升级到iQOO 10、iQOO 10 Pro、X80 Pro的开发者体验版,想对应降级到Android 12.0正常系统版本,请使用降级工具进行降级工作,具体请参考:

https://bbs.vivo.com.cn/newbbs/thread/32215628?show_title=1

3、反馈

如果您在使用中遇到严重问题,请进入对应的群进行反馈,群验证信息请填写手机的IMEI号

iQOO 10、iQOO 10 Pro QQ群 : 854374916

X80 Pro QQ群 : 759578505

4、Android 13 特性:

新增特性功能,包括但不限于:

  • 照片选择器

提供了一种更安全的媒体共享方式,而无需向应用授予整个媒体库的访问权限。

  • 控制中心

允许应用主动添加开关至控制中心,方便用户便捷地添加应用的控制中心开关。

  • 前台服务管理器

新增 前台服务管理功能,您可以通过控制中心查看运行中的前台服务及服务的运行时长,并随时停用前台服务。

5、已知问题

iQOO 10、iQOO 10 Pro:

1、当前系统版本有较多常用三方应用与 Android 13 不兼容,升级后可能会出现第三方应用无法正常使用的情况(如闪退、卡顿、黑屏、耗电等),建议您谨慎升级。

2、下拉状态栏,低概率背景透明,自动恢复。

3、健康APP概率定位异常,无法形成轨迹。

4、部分应用未同步深色模式。

X80 Pro:

1、当前系统版本有较多常用三方应用与 Android 13 不兼容,升级后可能会出现第三方应用无法正常使用的情况(如闪退、卡顿、黑屏、耗电等),建议您谨慎升级。

2、部分系统弹框主题样式不一致

3、分屏时,移动分屏,存在低概率性动画不连贯,出现黑屏

4、连续快速多次人像拍摄时,手机相机出现低概率的闪退

GPS定位是如何工作的?

GPS定位是如何工作的?

1、确认手机带GPS模块并打开。

2、手机上的安全软件(例如360、安全管家或系统自带的安全中心)不要限制app的定位权限。

例如:MIUI系统在:安全中心-权限管理-定位里,检查一下是否限制了app的定位权限。

3、GPS定位要在开阔地带,室内无法接收到GPS信号,所以不要在室内尝试。

4、安卓系统运行时间长了,会有一些系统的因素造成的bug,确认以上三点没问题的还不能定位的,重启手机一下试试。

5、下载一款GPS测试软件(GPS Test等),测试手机gps是否正常。

成立一家软件外包公司一般需要有那些人员,需要组件那些必要团队

成立一家软件外包公司一般需要有那些人员,需要组件那些必要团队
app软件制作公司专业项目团队成员包括:项目经理、PM产品经理、UIUX设计、UX制作、IOS制作、Android制作、软件测试、技术支持、运营人工。每位团队成为都有着明确分工,从企业主的需求出发,通过前期的需求文档,团队技术成员和企业进行项目沟通,从技术本身到应用市场以及案例分析,帮忙助力企业主完成整个项目的周全性分析,找准项目的定位及商业运营模式,提出专业意见及技术的可行性解决方式。

长沙app软件制作公司完整的团队技术人工分工如下:

PM产品经理:与客户进行初步沟通,确定客户的app制作项目需求后协同项目经理,确定需求的可行性方式;第2步制定项目需求文档,确定项目是为了解决哪些现存的痛点,项目的功能布局并将主要功能列举并完善,已文字或者图文的方案记录在档。

项目经理:依据PM产品经理需求文档进行原型图设计,包括功能的结构性布局、主页及分页的设计、页面间业务逻辑的实现及设计,将每个页面的功能原型设计图交由UIUX设计。在这过程中,会出现再一次需求沟通和具体的技术实现沟通,将项目逻辑更为详细化,这也是app制作项目想要在前期沟通开销时间的重要所在。

UIUX设计:在项目经理将原型图经过反复的推敲和修正后,UIUX会正式进入设计阶段,界面之间的配色、图标的设计与整体搭配、功能具象化、页面交互设计、页面与各系统与机型之间的适配,在这期间,UIUX设计会和项目经理就设计过程中遇到的显示及不匹配问题进行沟通协商,是因为一旦在页面适配上出现问题,势必要修改部分图标或者文字、功能位置等。待问题确定后,定稿输出高清UIUX设计图。

UX制作:将UIUX设计的师交付的静态图片,以代码的形式写成动态的或者可交互的页面形式,从UX开始,项目正式进入到代码阶段。这时我们的网站或者app是能够访问点击的状态,在整个的app制作项目中是承上启下的作用,也是一种关键的转折点,将静态的图片变成动态的网页。

IOS制作:依据IOS系统规则编写代码,依据不同的端口编写功能上的逻辑代码、编写接口协议文档,服务器环境架设、设计数据库和编写API接口。

Android制作:依据Android系统规则编写代码,依据不同的端口编写功能上的逻辑代码、编写接口协议文档,服务器环境架设、设计数据库和编写API接口。

软件测试:app功能制作完成后,测试人工想要对整个项目进行系统的测试,期间会几乎会调动整个项目的相关人工,测试环节的关键性能够说和前期的功能规划同等关键。测试环节是最容易找出项目中的遗漏之处,找出Bug,并对已经出现的问题进行管理,包括bug的修复进度、优先级、

相关负责人等,高质高量的解决问题,在规定的时间内完成项目的交付。

技术支持:测试完成后,项目进入上架发布阶段,发布应用市场,iOS是发布到AppStore(由于苹果系统审核严格,版本更新升级快,在不符合上架发布诉求的情况下并不会具体指出不符合的地方,因此对技术人工的经验就有一定的诉求),Android应用市场较多,核心有应用宝、手机助手、各手机厂商自己的商城。

产品正式投放到应用市场后,会得到用户的下载和使用数据,这时候就想要依据实际的数据情况来进行运营的调整,当现有的功能或者设计无法满足用户的需求时想要进行产品的升级,想要重新经历以上流程。运营推广在以后承担着项目成功与失败的重担,好产品本身的高质量确是运营推广成功与否的重要。注重业务人工和技术人工的沟通能在前期规避很多运营时遇到的市场问题和制作过程中的技术实现问题。运行良好的app,产品的生命时间周期(需求-立项-原型设计-UIUX设计-制作-测试-上架发布-运营)就是这样循环往复的。因此长沙app软件制作公司哪家好?只需我们去了解长沙app软件制作公司的项目团队,人工配置,技术团队能力,这些是体现app软件制作公司是否专业最直观的表现。

共享电动车移动应用制作想要注意什麽

移动互联网时代下,互联网技术日益在发挥着其本身的关键作用,其中共享电动车移

动应用制作亦是当前时代的一个产物,可以实现用户对于共享电动车设备的体验优化。

一、共享电动车移动应用制作能够实现哪些便捷?
共享设备在现在社会当中的运用范围可谓是越来越广,一方面,大家对于共享电动车的使用日益接受,并且通过这样的代步功能,能够更好地节约用户的出行时间。另一方面,通过共享电动车移动应用制作,也实现了用户对于这样一款共享设备的操作性优化,让用户能够通过手机官方来实现对共享设备从查找到使用控制的一站式服务流程。
2、共享电动车移动应用制作想要注意什麽?
1、依据对于市场的调研成果来确认功能需求
在进行共享电动车移动应用制作之前,制作一方想要去做好市场调研,了解市场对于这样一款共享电动车设备的使用需求包括哪些。市场调研的成果能够充分反映出用户的需求度,官方在依据数据情况来确认官方想要具备的各类功能板块。
二、想要维持好官方运行过程中的稳定性
系统在运行过程中的稳定性关系到用户对于该设备的使用体验,假设说用户使用该软件或者是设备的时候出现一些系统方面的问题,这么自然会影响到用户对于该共享设备以及软件的体验感。因此说在进行共享电动车移动应用制作的过程中,想要做好检测工作,针对系统运行过程中的各类情况来进行分析,发现问题也想要首先时间内容作出反应,调节系统稳定性。
三、完善硬件设备的功能性
共享电动车移动应用制作是方便用户通过手机移动应用软件来实现硬件控制的官方,这么对于共享电动车本身的硬件诉求也是有的,官方想要通过完善硬件设备的功能,来进一步保障用户的整体使用体验。

以上便是共享电动车移动应用制作的相关信息内容介绍,假设有系统制作、移动应用制作或者是小程序制作需求,欢迎咨询我们。

舞蹈移动应用软件制作当前市场发展分析

我们能够在各个场所当中发现舞蹈的存在,舞蹈由于自身的节奏、舞蹈的形式等等内容的不同,呈现出来的画面以及节奏感也不同样,对此,不同的舞蹈种类也有着专门的学习的爱好者。舞蹈移动应用软件制作亦是针对舞蹈需求来提供线上服务的官方,符合互联网下舞蹈行业的发展所需。

一、舞蹈移动应用软件制作当前市场发展分析
现在的舞蹈团队越来越多,并且很多的活动都会想要舞蹈来活跃气氛,并且喜欢跳舞的用户也不少,针对此类用户来进行舞蹈移动应用软件制作正好符合大众对于舞蹈学习的个性化需求。跳舞的功底也并非一蹴而就,想要进行长时间的奋斗以及练习,因此现阶段的舞蹈俱乐部或者是机构也成为了舞蹈爱好者的聚集地,汇聚了大量喜欢跳舞的年轻人。舞蹈移动应用软件制作作为一种线上官方,不止能够实现对于互联网资源的拓展,同时对于消费

者用户来看,这样的一种线上舞蹈官方也符合大众对于舞蹈操作的多元化需求。
2、舞蹈移动应用软件制作能够带给用户哪些体验?
1、舞蹈资讯内容推送
官方能够通过关于舞蹈的短视频内容、舞蹈的图片呈现等等方案让用户能够了解关于舞蹈的各类信息内容。
二、舞蹈精确分类板块
舞蹈移动应用软件制作提供给用户精确的分类板块,以便于有想要的用户对舞蹈内容进行查看了解,舞蹈的精确分类帮忙助力用户能够迅速找到他们所想要的舞蹈板块。
三、培训机构在线报名
对于线下培训机构感兴趣的用户,可以通过官方对周边的舞蹈培训机构进行查看,同时依据自身需求开放选用线上报名。
四、线上舞蹈教程查看
舞蹈移动应用软件制作能够为用户提供多种舞蹈教程,以便于有想要的用户来对这些舞蹈教程进行查看,实现线上的教程内容掌握途径,这样用户即是在家中也能够依据教学视频来进行舞蹈的练习。

以上便是舞蹈移动应用软件制作的相关信息内容介绍,假设有系统制作、移动应用制作或者是小程序制作需求,欢迎咨询我们。

制作教程|WebStorm插件安装及使用教程

让HTML五UX制作者使用WebStorm迅速制作原生苹果与安卓移动应用。

WebStorm 一门APP Plugins是一门APP为制作者提供的一套开源的WebStorm扩展插件。

包括:应用管理、应用框架、页面模型、代码提示、代码管理、Widget封装、真机同步、日志输出、管理自定义AppLoader等功能,其他的功能插件也在不断递增;所有插件都已开源,制作者能够下载这些插件在自己的WebStorm中安装后使用,制作者也能够在此基础上按需求扩展自己的插件。

依赖环境java当前支持环境Windows 或 MacAndroid 和 ios手机第一下载插件1、通过一门APP平台网站下载webStorm-一门APP.zip文件。

二、把webStorm-一门APP.zip解压到WebStorm的工作空间中。

打开WebStorm 的 ‘External Tools’选项Mac点击 状态栏中WebStorm ,在下拉菜单中,点击 PreferencesWindows安装”创建新应用”插件一.新建空白应用。

在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容:name : 新建空白应用Program : javaParameters : -jar $ProjectFileDir$/webStorm-一门APP/webStorm_app.jar $ProjectFileDir$ $Prompt$ default二.新建底部导航应用。

在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容:name : 新建底部导航应用Program : javaParameters : -jar $ProjectFileDir$/webStorm-一门APP/webStorm_app.jar $ProjectFileDir$ $Prompt$ bottom三.新建首页导航应用。

在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容:name : 新建首页导航应用Program : javaParameters : -jar $ProjectFileDir$/webStorm-一门APP/webStorm_app.jar $ProjectFileDir$ $Prompt$ home四.新建侧边导航应用。

在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容:name : 新建侧边导航应用Program : javaParameters : -jar $ProjectFileDir$/webStorm-一门APP/webStorm_app.jar $ProjectFileDir$ $Prompt$ slide安装”创建一门APP文件”插件在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容:name : 创建一门APP文件Program : javaParameters : -jar $ProjectFileDir$/webStorm-一门APP/webStorm_app.jar $ProjectFileDir$ $Prompt$ new $FileDir$安装”android真机同步”插件在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容:name : android真机同步Program : javaParameters : -jar $ProjectFileDir$/webStorm-一门APP/webStorm_loader.jar $ProjectFileDir$/webStorm-一门APP/ $FileDir$/安装”Android日志输出”插件在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容:name : Android 日志输出Program : javaParameters : -jar $ProjectFileDir$/webStorm-一门APP/webStorm_log.jar $ProjectFileDir$/webStorm-一门APP安装”ios真机同步”插件在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容:name : ios真机同步Program : javaParameters : -jar $ProjectFileDir$/webStorm-一门APP/webStorm_loader.jar $ProjectFileDir$/webStorm-一门APP/ $FileDir$ ios插件的使用右键点击 工作空间(文件夹) -> 弹出菜中选用 ‘External Tools’ -> 依据想要选用相应的插件。

假设有弹出的输入框,请输入对应的项目名称或者文件名称。

注意事项,目录结构为:workspace-项目根目录-项目文件。

假设是workspace-项目文件, 这样是错误的,会导致无法WiFi真机同步。

插件的快捷键设置打开WebStorm 的 ‘Keymap’ 中’External Tools’选项勾选要设置快捷键的插件,点击右键 -> Add Keyboard Shortcut。

在首先个输入框中,输入快捷键。

平台 Loader 真机同步Android设备真机同步1、启动Android模拟器,例如:海马玩模拟器下载,或通过 USB 线连接 Android 手机,确保 ‘USB 调试’ 已打开,等待手机与电脑连接成功二、真机同步快捷键。

在widget项目的任何编辑页面通过快捷键可直接进行真机同步。

iOS设备真机同步iOS设备在 MAC 系统和Windows 系统下真机同步想要的环境略有不同,Windows系统想要安装配置iTunes 和 iTools;MAC系统只需安装JDK即可。

暂不支持iOS 十 以上版本的手机。

1、Windows 下 iOS 真机同步安装 iTunes 和 iTools (MAC 下无需此步骤)。

下载地址分别为 iTunes 下载。

iTools 下载。

安装成功后想要把相关目录放到系统环境变量中。

环境变量设置如下:注意:MAC系统无需此配置,只想要安装JDK即可。

右键我的电脑->属性 将弹出 “系统” 界面Path 变量的设置 为iTools和iTunes安装位置,如 C:\ProgramData\ThinkSky\iTools\Driver\;C:\Program Files (x八六)\Common Files\Apple\Apple Application Support\二、设置好相关环境后通过 USB 线连接 iOS 手机,等待手机与电脑连接成功三、右键点击 一门APP 应用文件夹 -> External -> ‘iOS真机同步..’四、由于 iOS 不会自动启动应用,想要等待 WebStorm 提示同步成功代表同步完成。

注意事项:工作空间的全路径中,不要有空格。

平台 Loader 怎么更新1、到文档的 Download 页面下载最新的平台 AppLoader二、替换已安装的真机同步插件里的平台 AppLoader(\插件安装目录\webStorm-一门APP\appLoader\yimenapp-loader\),想要重命名为 ‘load.apk’。

三、iOS的平台loader替换已安装的真机同步插件里的平台 AppLoader(\插件安装目录\webStorm-一门APP\appLoader\yimenapp-loader-ios\),想要重命名为 ‘load.ipa’。

自定义 Loader 真机同步1、在 一门APP 云官方先创建一种应用,比如叫:moduleTest二、用 WebStorm 在本地也创建一种应用(方法同创建新应用),名字自定义,比如也叫:moduleTest三、打开本地创建的 moduleTest 应用的 config.xml 文件,把其中的 id 修改成云官方创建的应用 ID四、进入 一门APP 云官方的代码页面 -> 点击’上传代码’按钮 -> 点击’选用zip’按钮 -> 选用moduleTest的压缩包 -> 等待上传成功五、在 一门APP 控制台中,配置好应用的端设置、证书、包名等,再进入 -> 模块页面 -> 添加自己想要的模块六、到 一门APP 官方 -> 模块页面 -> 选用’自定义Loader’标签七、点击自定义 Loader 编译按钮 -> 等待编译完成 -> 下载成功八、Android 应用的真机同步: 找到 webStorm-一门APP 安装目录 -> \安装目录\webStorm-一门APP\appLoader\custom-loaderiOS 应用的真机同步: 找到 webStorm-一门APP 安装目录 -> \安装目录\webStorm-一门APP\appLoader\custom-loader-ios新建一种文件夹,以云端应用 ID 命名,把刚下载的自定义 Loader 放入此目录,重命名为 ‘load.apk’九、新建一种 ‘load.conf’ 文件(version – 自定义 Loader 版本号,packageName – 应用包名),格式如图:**注意,iOS 假设使用平台默认的证书,没有上传自己的iOS证书,则自定义Loader的包名统一为:com.api.customloader十、右键点击本地应用 moduleTest 文件夹 -> 弹出菜中选用 ‘External Tools’ -> Android真机同步 或者 ios真机同步。

11、等待 Android 手机自动打开刚同步的应用,代表同步成功,iOS不会自动打开应用,想要手动打开同步完的应用1二、暂不支持iOS 十 以上版本的手机。

WiFi真机同步和WiFi真机预览请看 WebStorm WiFi真机同步和WiFi真机预览专题文档( //docs.yimenapp.com/Dev-Tools/webStorm-wifi-sync )WiFi日志输出插件安装,使用windows 版插件安装、使用把插件包中 wifilog.jar 放到目录C:\一门APP\workspace 下。

在 Settings-Tools-Terminal 面板配置如图所示内容:cmd.exe /K “chcp 九三六 && java -jar C:/一门APP/workspace/wifilog.jar C:/一门APP/workspace/log_info”按快捷键 Alt+F1二启动WiFi日志输出。

有些键盘可能想要同时按fn键。

Mac 版插件安装、使用在 ‘External Tools’选项中,点击 ‘+’ 。

在Create Tool中,填写如下内容,填完后点击ok。

如图:-jar $ProjectFileDir$/webStorm-一门APP/wifilog.jar $ProjectFileDir$/webStorm-一门APP/wifisync_tools/log_info安装 一门APP 代码提示插件1、点击顶部菜单 ‘file’ ,选用 ‘Import Settings’。

二、弹出的对话框输入插件路径,点击OK即可。

三、弹出的对话框如图选用’Live templates’,点击OK即可,等待重启 ‘webstorm’,即可使用。

代码提示功能保证 一门APP 代码提示插件安装成功,无需额外配置即可使用,在 JS 文件或  标签内部能够触发提示。

api 对象上面的属性及方法,在输入 api. 时触发提示,按 ‘↑ ↓方向键’ 选用想要的 API,勾选后按回车键完成代码补全。

$api 对象上面的方法,在输入 $api. 时触发提示,按 ‘↑ ↓方向键’ 选用想要的 API,勾选后按回车键完成代码补全。

模块代码提示:以 fs 模块为例,先输入 ‘api.req’ 触发代码提示,require 相应的模块,然后输入’模块名.’时能够触发模块代码提示,按 ‘↑ ↓方向键’ 选用想要的 API,勾选后按回车键完成代码补全。

注意: 假设想新增自定义的模块代码提示,能够参照webStorm 一门APP代码提示插件编写文档。

使用 subversion选用svn项目名称的路径 ,如图可能想要输入svn的账户和密码选用按钮 No

开发APP从一门开始www.yimenapp.com
APP打包:https://www.yimenapp.com/more.html
EXE打包:https://www.yimenapp.com/exe.html
商城APP:https://www.yimenapp.com/shop.html
IOS免签打包:https://www.yimenapp.com/iosmianqian.html
APP上架:https://www.yimenapp.com/iosup.html
APP软著申请:https://www.yimenapp.com/softpage.html
SSL申请:https://www.yimenapp.com/ssl.html
Discuz APP:https://www.yimenapp.com/discuz.html
教程汇总:https://www.yimenapp.com/jiaocheng.html

Android系统会向PC端衍生?Android 13系统居然支持桌面端排版

最近Android13系统推出了开发者版本,不少安卓Android资深开发者都下载体验尝鲜了,有一位非常特别的小伙伴居然在Android13开发模式下捣鼓出了桌面端系统才有的窗口排版样式,这实在令人很惊喜!

(图:Android 13桌面版窗口)

一看到这个图,是不是第一会想到这是一个电脑端才有的桌面窗口视窗,这完全就是一个PC视窗嘛!

嗯,获取在不久的将来Android 系统会真的支持电脑版桌面呢!

但是目前来看这只是开发版本安装到桌面电脑上才能调试出来的桌面自定义窗口,应该只是为了方便开发者在PC端查看和操作而已,并且仅仅停留在Android开发阶段而已。

如果您是Android开发者,赶快去官方下载Android开发版本体验尝鲜把!

推荐几款APP开发工具

RhoMobile

  RhoMobile提供了Rhodes,这是一种基于Ruby的开源框架。这个工具让开发人员可以开发能够跨一大批操作系统和智能手机运行的原生应用程序。操作系统包括安卓、Windows Mobile、iPhone,几乎涵盖所有主流操作系统。

  使用RhoMobile提供的框架,你只需要编写一次代码。该代码可以用来为大多数主流的智能手机开发应用程序。原生应用程序很适合与现有的硬件协同运行,所以你可以轻松、快速、准确地完成开发任务。

  RhoMobile还为开发人员提供了RhoHub和RhoSync,前者是一种托管型的开发环境,后者可以作为独立式服务器软件来部署,以便确保用户手持设备上的所有应用程序数据是最新的。

(图:app开发工具)

  APICloud 和Dcloud

  APICloud是中国领先的“云端一体”移动应用云服务提供商, 通过端API和云API来简化移动应用开发技术,可以帮助开发者快速实现移动应用的开发、测试、发布、运营等全生命周期管理。

  MoSync

  MoSync是另一种FOSS跨平台移动应用程序开发SDK工具,它基于标准的Web编程技术。这个SDK为开发人员提供了集成的编译器、代码库、运行时环境、设备配置文件及其他实用工具。MoSync现在包括基于Eclipse的集成开发环境(IDE),用于C/C++编程,计划支持JavaScript、PHP、Ruby、Python及诸如此类的其他语言。

  MoSync提供了对几种操作系统的支持,其中包括Windows Mobile、安卓、塞班、Moblin甚至一款移动Linux发行版。发布MoSync 2.4后,很快就会推出支持iPhone OS和黑莓的功能。

  Xamarin

  Xamarin近年来比较流行,通过Xamarin,开发者只需使用C#语言即可开发出iOS、Android、Mac及Windows原生App。与基于HTML/JS/CSS的PhoneGap相比,Xamarin最大的优势是通过与系统的底层API通信并与系统原生UI直接交互,可以保证应用的高性能和UI流畅性。

  React Native

  React Native其实并不是一个真正意义上的跨平台App开发方案,而是让你能够使用相似的方法和同样的语言来在不同平台进行开发的工具,可以直接在Github上下载源代码使用。React Native的主要工作是构建响应式的View,其长处在于根据应用所处的状态来决定View的表现状态。而到目前为止,其Android版本还未发布,在构建跨平台App上显得还不够成熟,暂时还不是一个很好的选择 。

众所周知开发App比较复杂,不仅要懂多种编程语言还要考虑高额的成本。作为开发者需要找到一个既节省成本又能快速开发App的最佳解决方案。不少跨平台开发工具便应运而生,选择一款适合自己的工具尤为重要,以上这几款跨平台开发工具或者框架可以帮你轻松完成App开发。