android static达到Service与Activity于Handler沟通
2015-09-09 21:47
585 查看
供static理解力,仅适用于static理解力,不喜勿喷
第一种方式:离Service中获取Activity的static变量,调用该静态变量的getHandler()获取Handler进行发送消息
MainActivity:
TestService:
另外一种方式:将Activity中的Handler设置为static,然后直接在Service中调用Activity的静态Handler的进行发送消息
MainActivity:
TestService:
Java Static:作为修饰符, 能够用来修饰变量、方法、代码块(但绝对不能修饰类)。
1、修饰变量:
类的全部对象共有的一个属性。也称为类变量。这类似于C语言中的全局变量。类变量在类载入的时候初始化,并且仅仅被初始化一次。在程序中不论什么对象对静态变量做改动,其它对象看到的是改动后的值。
因此类变量能够用作计数器。另外,Java
Static变量能够用类名直接訪问,而不必须要对象。
2、修饰方法:
类的全部对象共有的一个功能。称为静态方法。
静态方法也能够用类名直接訪问。而不必须要对象。所以在静态方法里不能直接訪问非静态变量和非静态方法,在Static方法里不能出现this或者super等keyword。
3、修饰Java代码块:
用static去修饰类里面的一个独立的代码块。称为静态代码块。静态代码块在类第一次被载入的时候运行,并且仅仅运行一次。
静态代码块没有名字,因此不能显式调用,而仅仅有在类载入的时候由虚拟机来调用。它主要用来完毕一些初始化操作。
4、说说类载入:
JVM在第一次使用一个类时,会到classpath所指定的路径里去找这个类所相应的字节码文件, 并读进JVM保存起来,这个过程称之为类载入。
可见,不管是变量,方法,还是代码块,仅仅要用static修饰,就是在类被载入时就已经"准备好了",也就是能够被使用或者已经被运行。都能够脱离对象而运行。
反之,假设没有static。则必须通过对象来訪问。
引用地址:http://blog.csdn.net/sniperwang/article/details/4744753
第一种方式:离Service中获取Activity的static变量,调用该静态变量的getHandler()获取Handler进行发送消息
MainActivity:
package com.example.test; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.support.v4.content.IntentCompat; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.os.Build; public class MainActivity extends ActionBarActivity { Handler handler; //static Handler handler; Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = getApplicationContext(); handler = new Handler(){ @Override public void handleMessage(Message msg) { String string = (String)msg.obj; Log.e("Log",string); super.handleMessage(msg); } }; TestService.startSevice(MainActivity.this); Log.e("Log","TestService start ok" ); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public Handler getHandler(){ return this.handler; } public Context getContext(){ return this.context; } }
TestService:
package com.example.test; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.support.v4.content.IntentCompat; import android.util.Log; public class TestService extends Service { private static MainActivity mainActivity; static void startSevice(Context c) { mainActivity = (MainActivity) c; Intent in = new Intent(c, TestService.class); c.startService(in); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { Log.e("Log","TestService start ok2" ); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //new TestThread(mainActivity).start(); new TestThread(mainActivity).start(); return super.onStartCommand(intent, flags, startId); } class TestThread extends Thread { private Context context; private Handler handler; public TestThread(){ } public TestThread(Context context) { this.context = context; this.handler = ((MainActivity) context).getHandler(); } @Override public void run() { Message msg = new Message(); msg.obj = "HelloWorld!"; handler.sendMessage(msg); //MainActivity.handler.sendMessage(msg); super.run(); } } }
另外一种方式:将Activity中的Handler设置为static,然后直接在Service中调用Activity的静态Handler的进行发送消息
MainActivity:
package com.example.test; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.support.v4.content.IntentCompat; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.os.Build; public class MainActivity extends ActionBarActivity { //Handler handler; static Handler handler; //Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //context = getApplicationContext(); handler = new Handler(){ @Override public void handleMessage(Message msg) { String string = (String)msg.obj; Log.e("Log",string); super.handleMessage(msg); } }; //TestService.startSevice(MainActivity.this); Intent intent = new Intent(MainActivity.this,TestService.class); startService(intent); Log.e("Log","TestService start ok" ); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public Handler getHandler(){ return this.handler; } //public Context getContext(){ // return this.context; //} }
TestService:
package com.example.test; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.support.v4.content.IntentCompat; import android.util.Log; public class TestService extends Service { //private static MainActivity mainActivity; //static void startSevice(Context c) { // mainActivity = (MainActivity) c; // Intent in = new Intent(c, TestService.class); // c.startService(in); //} @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { Log.e("Log","TestService start ok2" ); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //new TestThread(mainActivity).start(); new TestThread().start(); return super.onStartCommand(intent, flags, startId); } class TestThread extends Thread { private Context context; private Handler handler; public TestThread(){ } public TestThread(Context context) { this.context = context; this.handler = ((MainActivity) context).getHandler(); } @Override public void run() { Message msg = new Message(); msg.obj = "HelloWorld!"; //handler.sendMessage(msg); MainActivity.handler.sendMessage(msg); super.run(); } } }
Java Static:作为修饰符, 能够用来修饰变量、方法、代码块(但绝对不能修饰类)。
1、修饰变量:
类的全部对象共有的一个属性。也称为类变量。这类似于C语言中的全局变量。类变量在类载入的时候初始化,并且仅仅被初始化一次。在程序中不论什么对象对静态变量做改动,其它对象看到的是改动后的值。
因此类变量能够用作计数器。另外,Java
Static变量能够用类名直接訪问,而不必须要对象。
2、修饰方法:
类的全部对象共有的一个功能。称为静态方法。
静态方法也能够用类名直接訪问。而不必须要对象。所以在静态方法里不能直接訪问非静态变量和非静态方法,在Static方法里不能出现this或者super等keyword。
3、修饰Java代码块:
用static去修饰类里面的一个独立的代码块。称为静态代码块。静态代码块在类第一次被载入的时候运行,并且仅仅运行一次。
静态代码块没有名字,因此不能显式调用,而仅仅有在类载入的时候由虚拟机来调用。它主要用来完毕一些初始化操作。
4、说说类载入:
JVM在第一次使用一个类时,会到classpath所指定的路径里去找这个类所相应的字节码文件, 并读进JVM保存起来,这个过程称之为类载入。
可见,不管是变量,方法,还是代码块,仅仅要用static修饰,就是在类被载入时就已经"准备好了",也就是能够被使用或者已经被运行。都能够脱离对象而运行。
反之,假设没有static。则必须通过对象来訪问。
引用地址:http://blog.csdn.net/sniperwang/article/details/4744753
相关文章推荐
- Android版本支付宝集成获取私钥与公钥
- Android高效加载大图、多图解决方案,有效避免程序OOM
- Android进程线程---Handler(常用)
- Android 异步任务:AsyncTask
- Android中常用adb命令及Log使用
- Android—获取控件的高度
- Android实例-操作sqlite数据之自建导航(XE8+小米2)
- Android菜鸟的启航
- Android绘制的一些总结onMeasure,onLayout,onDraw
- 0909Android基础安卓四大组件之Service
- Android VelocityTracker简介
- android多点触控统一的原理(使用 event.getAction()&MotionEvent.ACTION_MASK的原因)
- Android 编程下 Touch 事件的分发和消费机制
- Android 数据存储5种方式
- Android判断程序是前台还是后台
- Android多媒体——播放音频
- android AsyncTask详解
- Android四大组件---Service
- Android之VideoView播放视频
- android studio命令大全