編輯:關於Android編程
一個簡單的應用場景:假如用戶打開Activity以後,按Home鍵,此時Activity 進入-> onPause() -> onStop() 不可見。代碼在此時機發送一個Notification到通知欄。當用戶點擊通知欄的Notification後,又重新onRestart() -> onStart() -> onResume() 切換回原Activity。
package zhangphil.pendingintent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.TextView;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
public class MainActivity extends Activity {
private final int NOTIFICATION_ID = 0xa01;
private final int REQUEST_CODE = 0xb01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(this.getClass().getName(),"onCreate()");
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.textView);
tv.setText(System.currentTimeMillis() + "");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(this.getClass().getName(),"onRestart()");
}
@Override
protected void onStart() {
super.onStart();
Log.d(this.getClass().getName(),"onStart()");
}
@Override
protected void onResume() {
super.onResume();
Log.d(this.getClass().getName(),"onResume()");
}
//Android設備鎖屏也將進入onStop()
@Override
protected void onStop() {
super.onStop();
Log.d(this.getClass().getName(),"onStop()");
sendNotification(this);
}
private void sendNotification(Context context) {
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
context);
// 此處設置的圖標僅用於顯示新提醒時候出現在設備的通知欄
mBuilder.setSmallIcon(R.drawable.ic_launcher);
// mBuilder.setContentTitle("通知的標題");
// mBuilder.setContentText("通知的內容");
Notification notification = mBuilder.build();
// 當用戶下來通知欄時候看到的就是RemoteViews中自定義的Notification布局
RemoteViews contentView = new RemoteViews(context.getPackageName(),
R.layout.notification);
contentView.setImageViewResource(R.id.image, R.drawable.ic_launcher);
contentView.setTextViewText(R.id.title, "標題要長......");
contentView.setTextViewText(R.id.text, "內容要短......");
notification.contentView = contentView;
// 發送通知到通知欄時:提示聲音 + 手機震動 + 點亮Android手機呼吸燈。
// 注意!!(提示聲音 + 手機震動)這兩項基本上Android手機均支持。
// 但Android呼吸燈能否點亮則取決於各個手機硬件制造商自家的設置。
notification.defaults = Notification.DEFAULT_SOUND
| Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS;
// 點擊notification自動消失
notification.flags = Notification.FLAG_AUTO_CANCEL;
// 通知的時間
notification.when = System.currentTimeMillis();
// 需要注意的是,作為選項,此處可以設置MainActivity的啟動模式為singleTop,避免重復新建onCreate()。
Intent intent = new Intent(context, MainActivity.class);
// 當用戶點擊通知欄的Notification時候,切換回MainActivity。
PendingIntent pi = PendingIntent.getActivity(context, REQUEST_CODE,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.contentIntent = pi;
// 發送到手機的通知欄
notificationManager.notify(NOTIFICATION_ID, notification);
}
}
需要注意的是,默認Android的Activity為標准模式,即每次都new一個新的Activity出來,不是原先的Activity,在本例中,可以觀察到MainActivity中的onCreate()如果不修改啟動模式,則每次本調用每次TextView顯示的時間不同(遞增),所有為了使用原來的Activity、避免重復new一個新的出來,需要:
在AndroidManifest.xml中修改MainActivity啟動模式為:singleTop
notification.xml文件源代碼:
activity_main.xml:
Android 利用ContentProvider獲取聯系人信息
Android 利用ContentProvider獲取聯系人信息。在寫代碼前我們首先看一下運行的效果運行效果如下:點了獲取聯系人就展示如下效果讀取聯系人信息的
Android自定義View之繼承TextView繪制背景
本文實例為大家分享了TextView繪制背景的方法,供大家參考,具體內容如下效果:實現流程:1.初始化:對畫筆進行設置mPaintIn = new Paint();mPa
Android okhttp3 DNS 底層實現追蹤(一)
需求:Android 4.4 + okhttp 3.2;非root,在應用層,拿到DNS維度底層數據方案:jni + hook libc.so中DNS關鍵getaddri
Android開發 二:IPC機制(中)
好的,我們繼續來了解IPC機制,在上篇我們可能就是把理論的知識寫完了,然後現在基本上是可以實戰了。一.Android中的IPC方式 本節我們開始詳細的分析各中跨進程的方