Androidにおける通信メカニズムの概要
12244 ワード
1つ目は、handlerを使用して通信するhandlerです.プライマリ・スレッド(UIスレッド)のサブスレッドとして想像できます.プライマリ・スレッド(UIスレッド)にデータを送信してプライマリ・スレッド(UIスレッド)のUIと論理を更新することができます.handlerはサブスレッドなので、プライマリ・スレッドをブロックすることはありません.Androidの開発では,コードのどこかでプライマリスレッドが5秒以上ブロックされるとANR(システムプロンプト強制閉鎖)が提示されることが知られているので,時間のかかる操作ではサブスレッドを開いてANRを避けることが考えられる.handlerは、プライマリ・スレッドにメッセージを送信すると、プライマリ・スレッドのUIロジックの更新を待つなど、キュー形式で並べられます.
2.Notifation通知バー情報Notifation通知バーは、ユーザーが手動でNotifation通知バーを外さない限り、画面上でユーザーに情報を提示しますが、ユーザーが読んでいる内容は中断されません.Notifationの利点は、ユーザーが非常に重要な情報を読んでいるときにactivityを直接開くのを手伝うのは適切ではありません.その時の操作行為に直接影響したので、Notifationが出てきました.開発中にユーザーの使用を中断する可能性がある場合は、Notifation通知欄を使用することをお勧めします.
3.放送の送信と受信Android開発では、まったく関係のない2つのプログラム間の通信が必要であれば、放送の送信と受信のメカニズムを用いて実現することができ、例えばプログラムAが1つの放送プログラムBを送信して何かを受信すると、互いに通信することができる.
4.ActivityとActivityの間のジャンプはソフトウェアアプリケーションの開発において必ず複数のActivityがあります.そうすると、それらの間には相互ジャンプの関係があります.ジャンプの実現方法はIntentを使ってstartActivityを使うか、もちろんジャンプすればデータを持って行くことができます.例えば、AからBにジャンプすると、Aのデータの一部をIntentを通じてBに渡すことができます.
public class HandlerActivity extends Activity implements Runnable{
/** **/
public final static int UPDATE_TIME =0;
/** **/
public final static int UPDATE_COMPLETED =1;
/** 10 **/
private int mShowNumber = 0;
/** **/
private Button mButton = null;
/** **/
private TextView mTextView = null;
/** **/
private Thread mThread = null;
/** **/
private boolean mRunning = false;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Bundle bundle= msg.getData();
// key
String number = bundle.getString("number");
//msg.what handler
switch(msg.what) {
case UPDATE_TIME:
mTextView.setText(" " + number);
break;
case UPDATE_COMPLETED:
mTextView.setText(" ");
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.handler);
/** button TextView **/
mButton = (Button)findViewById(R.id.button0);
mTextView = (TextView)findViewById(R.id.textView0);
mThread = new Thread(this);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/** **/
mRunning = true;
mThread.start();
}
});
mTextView.setText(" ");
super.onCreate(savedInstanceState);
}
public void ShowDialog(String string) {
AlertDialog.Builder builder = new AlertDialog.Builder(
HandlerActivity.this);
builder.setIcon(R.drawable.icon);
builder.setTitle(string);
builder.setPositiveButton(" ", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
finish();
}
});
builder.show();
}
@Override
public void run() {
while (mRunning) {
try {
mShowNumber++;
/** bandle **/
Bundle bandle = new Bundle();
bandle.putString("number", String.valueOf(mShowNumber));
/** **/
/** bandle message **/
/** message **/
/** mShowNumber 10 **/
Message msg = new Message();
if(mShowNumber <=10) {
msg.what = UPDATE_TIME;
}else {
mRunning = false;
msg.what = UPDATE_COMPLETED;
}
msg.setData(bandle);
handler.sendMessage(msg);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2.Notifation通知バー情報Notifation通知バーは、ユーザーが手動でNotifation通知バーを外さない限り、画面上でユーザーに情報を提示しますが、ユーザーが読んでいる内容は中断されません.Notifationの利点は、ユーザーが非常に重要な情報を読んでいるときにactivityを直接開くのを手伝うのは適切ではありません.その時の操作行為に直接影響したので、Notifationが出てきました.開発中にユーザーの使用を中断する可能性がある場合は、Notifation通知欄を使用することをお勧めします.
public class NotificationActivity extends Activity {
NotificationManager mManager = null;
Notification notification =null;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.notification);
// , Notification
mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Notification
notification = new Notification(R.drawable.jay,
"Android ", System.currentTimeMillis());
// Notification
notification.flags = Notification.FLAG_AUTO_CANCEL;
// activity
Intent intent = new Intent(this, MyShowActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_NEW_TASK);
// bundle
Bundle bundle = new Bundle();
bundle.putString("name", " Notification ");
intent.putExtras(bundle);
//
PendingIntent contentIntent = PendingIntent.getActivity(this,
R.string.app_name, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.setLatestEventInfo(this, "Android ",
"QQ 164257885", contentIntent);
Button button0 = (Button)findViewById(R.id.button0);
button0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// Notification
mManager.notify(0, notification);
}
});
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// Notification
mManager.cancelAll();
}
});
super.onCreate(savedInstanceState);
}
}
3.放送の送信と受信Android開発では、まったく関係のない2つのプログラム間の通信が必要であれば、放送の送信と受信のメカニズムを用いて実現することができ、例えばプログラムAが1つの放送プログラムBを送信して何かを受信すると、互いに通信することができる.
public class BroadcastActivity extends Activity {
Button mButton0 = null;
Button mButton1 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.broadcast);
mButton0 = (Button)findViewById(R.id.button0);
mButton0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MyService.SEND_OK_MESSAGE);
intent.putExtra("name", " OK ");
sendBroadcast(intent);
}
});
mButton1 = (Button)findViewById(R.id.button1);
mButton1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MyService.SEND_CANCLE_MESSAGE);
intent.putExtra("name", " Cancle ");
sendBroadcast(intent);
}
});
// Service
Intent i = new Intent(this, MyService.class);
startService(i);
super.onCreate(savedInstanceState);
}
}
service service BroadcastReceiver onStart() AndroidManifest.xml 、
view plain
onStart()
view plain
public class MyService extends Service {
public final static String SEND_OK_MESSAGE = "send.ok.message";
public final static String SEND_CANCLE_MESSAGE = "send.cancle.message";
private BroadcastReceiver myBroadCast = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(SEND_OK_MESSAGE)) {
Toast.makeText(context, " " + SEND_OK_MESSAGE, Toast.LENGTH_LONG).show();
}else if(action.equals(SEND_CANCLE_MESSAGE)) {
Toast.makeText(context, " " + SEND_CANCLE_MESSAGE, Toast.LENGTH_LONG).show();
}
}
};
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
//
IntentFilter myFilter = new IntentFilter();
myFilter.addAction(SEND_OK_MESSAGE);
myFilter.addAction(SEND_CANCLE_MESSAGE);
this.registerReceiver(myBroadCast, myFilter);
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
service service , service activity , service scrvice activity scrvice scrvice ,
AndroidManifest.xml
view plain
view plain
BroadcastRecevier service service。
view plain
public class MyBootReceiver extends BroadcastReceiver {
/** **/
static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
/** service**/
if (intent.getAction().equals(BOOT_COMPLETED)) {
Intent i = new Intent(context, MyService.class);
context.startService(i);
}
}
}
4.ActivityとActivityの間のジャンプはソフトウェアアプリケーションの開発において必ず複数のActivityがあります.そうすると、それらの間には相互ジャンプの関係があります.ジャンプの実現方法はIntentを使ってstartActivityを使うか、もちろんジャンプすればデータを持って行くことができます.例えば、AからBにジャンプすると、Aのデータの一部をIntentを通じてBに渡すことができます.
intent bandle ? , Intent bundle bundle 。 3 activity A.B.C A B C , intent A B B C bundle B bundler C C 。
view plain
/**Activity **/
Button botton3 = (Button)findViewById(R.id.button3);
botton3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(mContext,ShowActivity.class);
// intent.putExtra()
intent.putExtra("name", " MOMO");
intent.putExtra("age", 25);
intent.putExtra("boy", true);
// bundle bundle intent.putExtra()
Bundle bundle = new Bundle();
bundle.putString("b_name", " ");
bundle.putInt("b_age", 23);
bundle.putBoolean("b_boy", false);
// bundle intent
intent.putExtras(bundle);
// activity intent
startActivity(intent);
}
});
view plain
public class ShowActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.my);
Intent intent = getIntent();
String name = intent.getStringExtra("name");
// intent
//
int age = intent.getIntExtra("age", 0);
boolean isboy = intent.getBooleanExtra("boy", false);
TextView textView0 = (TextView)findViewById(R.id.text0);
textView0.setText(" " + name + " " + age + " ? " + isboy);
Bundle bundle = intent.getExtras();
name = bundle.getString("b_name");
// bundle
//
age = bundle.getInt("b_age",0);
isboy = bundle.getBoolean("b_boy", false);
TextView textView1 = (TextView)findViewById(R.id.text1);
textView1.setText(" " + name + " " + age + " ? " + isboy);
super.onCreate(savedInstanceState);
}
}