安卓学习之广播的实践

来源:互联网 发布:超级记忆训练软件 编辑:程序博客网 时间:2024/06/06 08:23

《第一行代码》的学习。
模仿一个登陆流程,登陆后,点击退出发送广播强制退出,返回到登陆界面

  • 实现的时候基本有下面几个步骤
    • 一个ActivityCollector类管理所有的活动
    • 一个BaseActivity 类作为所有活动的父类
    • 一个LoginActivity继承于一个BaseActivity
    • MainActivity继承于一个BaseActivity显示登陆成功的界面


  • ActivityCollector类
public class ActivityCollector{    public static List<Activity> activities = new ArrayList<Activity>();    public static void addActivity(Activity activity)    {        activities.add(activity);    }    public static void  removerActivity(Activity activity)    {        activities.remove(activity);    }    public static void finishAll()    {        for(Activity activity: activities)        {            if (!activity.isFinishing())            {                activity.finish();            }        }    }}



+ BaseActivity 类

public class BaseActivity extends AppCompatActivity{    private ForceOfflineReceiver receiver;    @Override    protected void onCreate(Bundle savedInstaceState)    {        super.onCreate(savedInstaceState);        ActivityCollector.addActivity(this);    }    @Override    protected void onResume()    {        super.onResume();        //这里注册一个广播,用于接收下线的消息        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction("com.magikid.broadcastbestpractice.FORCE_OFFLINE");        receiver= new ForceOfflineReceiver();        registerReceiver(receiver, intentFilter);    }    @Override    protected void onPause()    {        super.onPause();        //取消注册        if(receiver != null)        {            unregisterReceiver(receiver);            receiver = null;        }    }    @Override    protected void onDestroy()    {        super.onDestroy();        ActivityCollector.removerActivity(this);    }    class ForceOfflineReceiver extends BroadcastReceiver    {        @Override        public void onReceive(final Context context, Intent intent)        {            AlertDialog.Builder builder = new AlertDialog.Builder(context);            builder.setTitle("Warning");            builder.setMessage("You are forced to be offline. Please try to login again");            builder.setCancelable(false);            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialog, int which) {                    ActivityCollector.finishAll();                    Intent intent = new Intent(context, LoginActivity.class);                    context.startActivity(intent);                }            });            builder.show();        }    }}
  • LoginActivity类
public class LoginActivity extends BaseActivity {    private EditText accountEdit;    private EditText passwordEdit;    private Button login;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_login);        accountEdit = (EditText)findViewById(R.id.account);        passwordEdit = (EditText)findViewById(R.id.password);        login = (Button)findViewById(R.id.login);        login.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v)            {                String account = accountEdit.getText().toString();                String password = passwordEdit.getText().toString();                if (account.equals("admin") && password.equals("123456"))                {                    Intent intent = new Intent(LoginActivity.this,  MainActivity.class);                    startActivity(intent);                    finish();                }                else                {                    Toast.makeText(LoginActivity.this, "account or password is invalid", Toast.LENGTH_SHORT).show();                }            }        });    }}//对应的layout <TextView            android:layout_width="90dp"            android:layout_height="wrap_content"            android:layout_gravity="center_vertical"            android:textSize="18sp"            android:text="Password"/>        <EditText            android:id="@+id/password"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:layout_gravity="center_vertical"/>    </LinearLayout>    <Button        android:id="@+id/login"        android:layout_width="match_parent"        android:layout_height="60dp"        android:text="Login"        />
  • MainActivity类
public class MainActivity extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button forceOffline = (Button)findViewById(R.id.force_offline);        //点击按钮发送下线的广播        forceOffline.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v)            {                Intent intent = new Intent("com.magikid.broadcastbestpractice.FORCE_OFFLINE");                sendBroadcast(intent);            }        });    }//对应的layout<Button    android:id="@+id/force_offline"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="Send force offline broadcast"    />

主配置xml,将LoginActivity设置为默认启动界面

     <activity android:name=".MainActivity">    </activity>    <activity android:name=".LoginActivity">        <intent-filter>            <action android:name="android.intent.action.MAIN"/>            <category android:name="android.intent.category.LAUNCHER"/>            </intent-filter>>    </activity>

一个简单的账号登录,模仿强制下线的Demo功能就完成了。主要是熟悉广播的试用