編輯:關於Android編程
Android 7.0 經過5個開發者預覽版本的改善,終於在8.22日正式推送,並確定版本名為Nougat(牛軋糖)
根據官方的介紹,Android Nougat的主要更新有:
性能
JIT編譯器、VR模式、Vulkan? API
使用新的JIT編輯器是的系統及應用有更快的啟動速度同時使用更少的內存,在系統更新時你再也不會有“Android is upgrading”的過程;<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCgk8cD5WUsSjyr221NauuvO74beisry1xERheURyZWFtu+HT0Lj8usO1xNans9ajuzwvcD4NCgk8cD48YSBocmVmPQ=="https://www.khronos.org/vulkan/" title="Vulkan? API">Vulkan? API 是一款新的3D渲染API,使游戲應用擁有更絢麗的顯示效果和渲染效率,不過目前該API僅適用於支持Vulkan的硬件設備,如Nextus 5X 、6P等
功耗與數據
Doze模式、優化電池管理、data Saver模式、後台數據訪問
使用效率
分屏模式、picture-in-picture、最近任務快速切換(雙擊菜單鍵)
Android 7.0開始支持應用分屏多任務,可以將手機屏幕拆分為兩個顯示區域,每個顯示區域相當於一個單獨的桌面,可以同時打開不同的應用
Pip模式指在Android TV以及Tablet上支持應用以懸浮窗體顯示
最近任務快速切換(雙擊菜單鍵)
通知
捆綁通知、直接回復、通知控制
Android 7.0重新設計了通知系統的顯示和設置方式
系統可用性提升
自定義快捷設置、重新設計快捷設置欄、重新設計設置、緊急信息、鎖屏壁紙
Andorid 7.0的設置模塊經過交互的重新設置,操作更加便捷,同時系統提供了自定義設置的接口,允許應用通過實現特定服務和接口實現應用設置集成到系統設置及下拉選項中
Emoji
Unicode 9 emoji Emoji表情更新
隱私和安全
direct boot、靜默系統應用更新、基於文件的加密、文件訪問控制
設備安裝與遷移
Android備份將保存更多設置信息
多語言
本地多語言支持、新的語言及語言設置
輔助功能
可變文字轉語音(TTS)速度
…重新設計了設置的交互,使設置操作更加快捷
如果使用過Youtube應用,一定對其視頻播放可作為懸浮窗顯示在應用上層的操作體驗印象深刻,Pip模式與之類似允許Activity以窗體的方式顯示在其他Activity上層,不影響底層Activity的操作,遺憾的是目前Pip模式僅支持Android TV以及Tablet版本
Notification在原有Notifacation.Action之上添加了Direct Reply功能
Tips:
RemoteInput
addRemoteInput(mRemoteInput)
使用Direct Reply Notification
RemoteInput mRemoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY).setLabel("Replay").build(); Intent intent = new Intent(this, TestActivity.class); intent.putExtra("notification_replay", true); PendingIntent mPendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); Notification.Action action = new Notification.Action.Builder(R.drawable.notification_icon, "Replay", mPendingIntent). addRemoteInput(mRemoteInput) .build(); Notification notification = new Notification.Builder(getApplicationContext()) .setContentTitle("ContentTitle") .setContentText("ContentText") .setSmallIcon(R.drawable.notification_icon) .setActions(action) .build(); NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this); notificationManagerCompat.notify(NOTIFICATION_ID, notification);
Notification.Action: 我們可以根據需要為Notification添加多個操作按鈕 setActions(Action… actions)
完整代碼
import android.app.Activity; import android.app.Notification; import android.app.PendingIntent; import android.app.RemoteInput; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.NotificationManagerCompat; import android.util.Log; import android.view.View; public class TestActivity extends Activity { private static final String TAG = "TestActivity"; private static final String KEY_TEXT_REPLY = "key_test_reply"; private static int NOTIFICATION_ID = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); findViewById(R.id.notification).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { send(); } }); if (getIntent().getExtras() != null) { if (getIntent().getExtras().getBoolean("notification_replay")) { Bundle remoteInput = RemoteInput.getResultsFromIntent(getIntent()); if (remoteInput != null) { Log.d(TAG, "onCreate: " + remoteInput.getCharSequence(KEY_TEXT_REPLY)); } sendReceiverNotification(); } } } private void sendReceiverNotification() { Notification secondNotification = new Notification.Builder(getApplicationContext()) .setSmallIcon(R.drawable.notification_icon) .setContentText("Message sent.") .build(); NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this); notificationManagerCompat.notify(NOTIFICATION_ID, secondNotification); } public void send() { RemoteInput mRemoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY).setLabel("Replay").build(); Intent intent = new Intent(this, TestActivity.class); intent.putExtra("notification_replay", true); PendingIntent mPendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); Notification.Action action = new Notification.Action.Builder(R.drawable.notification_icon, "Replay", mPendingIntent). addRemoteInput(mRemoteInput) .build(); Notification.Action actionTest = new Notification.Action.Builder(R.drawable.notification_icon, "Test", mPendingIntent) .build(); Notification notification = new Notification.Builder(getApplicationContext()) .setContentTitle("ContentTitle") .setContentText("ContentText") .setSmallIcon(R.drawable.notification_icon) .setActions(action,actionTest) .build(); NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this); notificationManagerCompat.notify(NOTIFICATION_ID, notification); } }
有關Notification的詳細設置可參考官方文檔 https://developer.android.com/guide/topics/ui/notifiers/notifications.html
在Android 7.0上系統提供了用戶添加自己的設置選項下拉設置內容中,具體參考android.service.quicksettings.Tile
彩蛋:當系統開啟開發者權限後,你會在設置編輯中看到顯示圖層便捷和GPU渲染的快捷設置項,很好用的一個設計
Android 7.0中進一步增強Doze對CPU喚醒的控制和網絡限制
Android 7.0 修改了私有文件的訪問權限,在Android 7.0上讀寫私有文件出會提示SecurityException.FileUriExposedException異常
Google Fuchsia項目
https://fuchsia.googlesource.com
https://fuchsia-review.googlesource.com
參考文檔:
https://www.android.com/versions/nougat-7-0/
https://developer.android.com/about/versions/nougat/index.html
對於Web網頁來說,頁面的訪問、加載速度對於用戶體驗來說是很重要的,而如果把Android中的每個Activity都看成是一個頁面的話,Activity的啟動速度憑主觀的
筆者發現在很多應用中,都有自動獲取驗證碼的功能:點擊獲取驗證碼按鈕,收到短信,當前應用不需要退出程序就可以獲取到短信中的驗證碼,並自動填充。覺得這種用戶體驗很贊,無須用戶
本文主要討論有向圖的十字鏈表表示,包括建圖,添加弧,刪除弧,以鄰接表的格式打印圖(其中包括兩種形式:1,同尾的弧構成條鏈 2,同頭的弧構成條鏈)c ++ 描述。類 Arc
WeTest導讀本文通過對內存洩漏(what)及其危害性(why)的介紹,引出在Unity環境下定位和修復內存洩漏的方法和工具(how)。最後提出了一些避免洩漏的方法與建