安卓期末复习之全局广播 + service绑定
有好多广播 比如 有序 全局 本地
就放一种 是 全局广播 比较会的就这一种
里面FactorialReceiver这是接收者 里面有求阶乘的方法
public class FactorialActivity extends AppCompatActivity { EditText editText; TextView textResult; FactorialReceiver factorialReceiverReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_factorial); editText=(EditText)findViewById(R.id.editText); factorialReceiverReceiver=new FactorialReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("my.action"); this.registerReceiver(factorialReceiverReceiver,filter); } @Override protected void onDestroy(){ super.onDestroy(); this.unregisterReceiver(factorialReceiverReceiver); } public void btnConClick(View view) { Intent intent=new Intent(); intent.setAction("my.action"); intent.putExtra("number",editText.getText().toString()); Toast.makeText(FactorialActivity.this, "number="+editText.getText().toString(), Toast.LENGTH_LONG).show(); this.sendBroadcast(intent); } class FactorialReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //接收number String number=intent.getStringExtra("number"); Toast.makeText(FactorialActivity.this, "成功接收number="+number,Toast.LENGTH_LONG).show(); int intNumber=Integer.parseInt(number); int result=1; for(int i=1;i<=intNumber;i++){ result=result*i; } if(intNumber==0){ result=0; } textResult=(TextView)findViewById(R.id.textResult); textResult.append(intNumber+"的阶乘是"+result+"\n"); } } } 效果图:
后面用的append进行文字添加的
service 有很多种方式与 activity联系 包括 start 和 绑定 start不同命(程序停止 service不停)绑定是同名的
绑定service分显式隐式
隐式需要注册动作如下
<service android:name=".MathService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="my.service.Myservice" /> </intent-filter> </service>
下面是activity的代码 里面有两种 显式的已经注释掉了
public class MathServiceActivity extends AppCompatActivity { EditText txtNumber; TextView txtResult; MathService.MyBinder binder; MathService mathService; private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { binder = (MathService.MyBinder) service; mathService = binder.getService(); } @Override public void onServiceDisconnected(ComponentName name) { System.out.println("close"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_math_service); txtNumber = (EditText)findViewById(R.id.txtNumber); txtResult = (TextView)findViewById(R.id.textResult); } public void btnStartClick(View view){ //显式启动 //Intent intent = new Intent(this,MathService.class); //bindService(intent,conn, Service.BIND_AUTO_CREATE); //隐式启动 Intent intent1 = new Intent(); intent1.setAction("my.service.Myservice"); intent1.setPackage("com.example.myapplication"); bindService(intent1,conn,Service.BIND_AUTO_CREATE); } public void btnStopClick(View view){ //现式解绑 //unbindService(conn); //隐式解绑 Intent intent1 = new Intent(); intent1.setAction("my.service.Myservice"); intent1.setPackage("com.example.myapplication"); unbindService(conn); } public void btnSumClick(View view){ if(txtNumber.getText().toString().trim().length()==0) return; int sum=mathService.getSum(Integer.parseInt(txtNumber.getText().toString().trim())); txtResult.setText(String.valueOf(sum)); } public void btnJieChengClick(View view){ if(txtNumber.getText().toString().trim().length()==0) return; int sum=mathService.getJieCheng(Integer.parseInt(txtNumber.getText().toString().trim())); txtResult.setText(String.valueOf(sum)); } }
值得一提的是 你看我的阶乘方法 和 求和方法 在service中一个是在binder类里面的 一个是在外面的就是放在activity里调用方式不一样但是实现效果没啥大不同
public class MathService extends Service { MyBinder binder = new MyBinder(); public MathService() { super(); } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Nullable @Override public IBinder onBind(Intent intent) { return binder; } public class MyBinder extends Binder { public MathService getService(){ return MathService.this; } } public double getMaxFromArray(double[] myArray){ if(myArray==null) return -1; double max=myArray[0]; for(int i=1;i<myArray.length;i++){ if(max<myArray[i]) max=myArray[i]; } return max; } public int getSum(int maxNumber){ int sum=0; for(int i=1;i<=maxNumber;i++) sum=sum+i; return sum; } public int getJieCheng(int maxNumber){ if(maxNumber>10) return 0; int sum=1; for(int i=1;i<=maxNumber;i++) sum=sum*i; return sum; } }
给你看一眼效果图 我就不沾前台了
有一个小问题 必须要点两次解绑定才可以不能计算并退出程序 还不知道为啥 哪个大佬知道给说说吧